Express不设置cookie

我有通过快递设置Cookie的问题。 我正在使用Este.js dev stack ,我尝试在API auth /loginpath中设置一个cookie。 这里是我在/api/v1/auth/loginpath中使用的代码

 res.cookie('token', jwt.token, {expires: new Date(Date.now() + 9999999)}); res.status(200).send({user, token: jwt.token}); 

src/server/main.js我已经注册了cookie-parser作为第一个中间件

 app.use(cookieParser()); 

/api/v1/auth/login路由的响应标头包含

 Set-Cookie:token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ.. 

但cookie不保存在浏览器document.cookie是空的, Resources - Cookies develepoers工具中的Resources - Cookies选项卡是空的):(

编辑:我发现,当我在/api/v1/auth/login (没有调用res.sendres.json )中调用这个时,

res.cookie('token', jwt.token, {expires: new Date(Date.now() + 9999999), httpOnly: false}); next();

然后cookie被设置并且响应头已经设置了X-Powered-By:Este.js …这在expression式前端渲染部分中设置了esteMiddleware

当我使用res.send

 res.cookie('token', jwt.token, {expires: new Date(Date.now() + 9999999), httpOnly: false}).send({user, token: jwt.token});` next(); 

那么我得到错误Can't set headers after they are sent. 因为使用send方法,所以前端渲染抛出这个错误。

但是我必须从API发送数据,所以我该如何处理?

可以帮助我吗? 谢谢!

       

网上收集的解决方案 "Express不设置cookie"

我遇到过同样的问题。 服务器响应附带cookie集:

 Set-Cookie:my_cookie=HelloWorld; Path=/; Expires=Wed, 15 Mar 2017 15:59:59 GMT 

但是cookie不是由浏览器保存的。

这就是我解决它的方法。

我在客户端代码中使用fetch 。 如果您没有在fetch选项中指定credentials: 'include' ,则虽然服务器响应设置了cookie,但Cookie不会被发送到服务器,也不会被浏览器保存。

例:

 var headers = new Headers(); headers.append('Content-Type', 'application/json'); headers.append('Accept', 'application/json'); return fetch('/your/server_endpoint', { method: 'POST', mode: 'same-origin', redirect: 'follow', credentials: 'include', // Don't forget to specify this if you need cookies headers: headers, body: JSON.stringify({ first_name: 'John', last_name: 'Doe' }) }) 

希望它有助于某人。

我工作与快递4和节点7.4和angular度,我有同样的问题,我帮助:
a)服务器端:在文件app.js我给所有的响应头像:

  app.use(function(req, res, next) { res.header('Access-Control-Allow-Origin', req.headers.origin); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); next(); }); 

这必须在所有的路由器之前
我看到很多添加了这个头文件:

 res.header("Access-Control-Allow-Headers","*"); res.header('Access-Control-Allow-Credentials', true); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 

但我不需要那个,

b)当你定义cookie时,你需要添加httpOnly:false,如:

  res.cookie( key, value,{ maxAge: 1000 * 60 * 10, httpOnly: false }); 

c)客户端:在发送ajax你需要添加:“withCredentials:true”,如:

 $http({ method: 'POST', url: 'url, withCredentials: true, data : {} }).then(function(response){ // code }, function (response) { // code }); 

祝你好运。

有几个问题:

  • httpOnly : false未明确设置的cookie将不能通过浏览器中的document.cookie访问。 它仍然会被发送HTTP请求,如果你检查你的浏览器的开发工具,你很可能会在那里findcookie(在Chrome浏览器中,它们可以在开发工具的资源标签中find)。
  • 如果您想推迟回复您的应用程序的其他部分的响应,那么您调用的next()应该被使用,根据您的代码判断,这不是您想要的。

所以,在我看来,这应该可以解决你的问题:

 res.cookie('token', jwt.token, { expires : new Date(Date.now() + 9999999), httpOnly : false }); res.status(200).send({ user, token: jwt.token }); 

作为一个方面说明:有一个原因, httpOnly默认为true (以防止恶意的XSS脚本访问会话cookie等)。 如果你没有很好的理由能够通过客户端JS来访问cookie,不要把它设置为false