Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么cookie没有被发送到服务器_Node.js_Angular_Express_Cookies - Fatal编程技术网

Node.js 为什么cookie没有被发送到服务器

Node.js 为什么cookie没有被发送到服务器,node.js,angular,express,cookies,Node.js,Angular,Express,Cookies,我有一个托管在服务器上的nodejs express应用程序。基本上,我有两个端点: POST/session-这是我发回cookie的地方 获取/resource-这是我检查cookie是否被发回的地方,如果没有,我发回401 not found,如下所示 在前端,它位于不同的域上(例如,一个新生成的angular cli应用程序正在htpp://localhost:4200),我尝试调用/sessionAPI,它返回cookie头,但是连续的/resourceAPI调用不会将cookie

我有一个托管在服务器上的nodejs express应用程序。基本上,我有两个端点:

  • POST
    /session
    -这是我发回cookie的地方
  • 获取
    /resource
    -这是我检查cookie是否被发回的地方,如果没有,我发回401 not found,如下所示
在前端,它位于不同的域上(例如,一个新生成的angular cli应用程序正在htpp://localhost:4200),我尝试调用
/session
API,它返回cookie头,但是连续的
/resource
API调用不会将cookie发送回服务器。我做错了什么

服务代码如下:

// server.js
const express = require("express");
const app = express();
const cookieParser = require("cookie-parser");
const cors = require("cors");

app.use(cors());

app.use((req, res, next) => {
  console.log(req.method, req.url, JSON.stringify(req.headers, null, 2));
  next();
});

app.use(cookieParser());

app.get("/", (req, res) => {
  res.send({ status: "running" });
});

app.post("/session", (req, res) => {
  const cookie = `AuthSession=token; Path=/;`;
  res.setHeader("Set-Cookie", cookie);
  res.send({ status: "logged in" });
});

app.get("/resource", (req, res) => {
  const authSessionCookie = req.cookies && req.cookies["AuthSession"];
  if (!authSessionCookie) {
    res.sendStatus(401);
    return;
  }
  res.send({ resource: "resource" });
});

const listener = app.listen(process.env.PORT, () => {
  console.log("Your app is listening on port " + listener.address().port);
});

export class AppComponent {
  constructor(private readonly httpClient: HttpClient) {
    this.httpClient
      .post("https://uneven-glowing-scorpion.glitch.me/session", {})
      .subscribe(resp => {
        console.log(resp);
        this.httpClient
          .get("https://uneven-glowing-scorpion.glitch.me/resource")
          .subscribe(resp => {
            console.log(resp);
          });
      });
  }
}
这是由/session API返回的cookie:

角度代码如下:

// server.js
const express = require("express");
const app = express();
const cookieParser = require("cookie-parser");
const cors = require("cors");

app.use(cors());

app.use((req, res, next) => {
  console.log(req.method, req.url, JSON.stringify(req.headers, null, 2));
  next();
});

app.use(cookieParser());

app.get("/", (req, res) => {
  res.send({ status: "running" });
});

app.post("/session", (req, res) => {
  const cookie = `AuthSession=token; Path=/;`;
  res.setHeader("Set-Cookie", cookie);
  res.send({ status: "logged in" });
});

app.get("/resource", (req, res) => {
  const authSessionCookie = req.cookies && req.cookies["AuthSession"];
  if (!authSessionCookie) {
    res.sendStatus(401);
    return;
  }
  res.send({ resource: "resource" });
});

const listener = app.listen(process.env.PORT, () => {
  console.log("Your app is listening on port " + listener.address().port);
});

export class AppComponent {
  constructor(private readonly httpClient: HttpClient) {
    this.httpClient
      .post("https://uneven-glowing-scorpion.glitch.me/session", {})
      .subscribe(resp => {
        console.log(resp);
        this.httpClient
          .get("https://uneven-glowing-scorpion.glitch.me/resource")
          .subscribe(resp => {
            console.log(resp);
          });
      });
  }
}

正如您所看到的,服务器可用于测试目的。

http://localhost:4200
https://uneven-glowing-scorpion.glitch.me
不是同一个域,因此不会发送cookie。就这么简单。没有办法用饼干来解决这个问题。Cookie不能跨域。这就是他们安全的原因


您的HTTP调用与Postman一起工作的原因是,该应用程序在这些情况下非常宽容;浏览器不是。关于这一点有很多问题。

我为服务器创建了一个小故障项目:服务器位于:我还创建了一个stackblitz angular应用程序,可在:
http://localhost:4200
https://uneven-glowing-scorpion.glitch.me
不是同一个域。因此,没有饼干。就这么简单。coolies@R.Richards(此处插入facepalm.gif)无法解决此问题。如果您可以添加此答案并进行解释,我将接受。你知道邮递员在这方面有什么不同吗?我正在和邮递员检查API,它在那里工作没有问题。。。