Express不设置cookie
我有通过快递设置Cookie的问题。 我正在使用Este.js dev stack
,我尝试在API auth /login
path中设置一个cookie。 这里是我在/api/v1/auth/login
path中使用的代码
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.send
或res.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发送数据,所以我该如何处理?
可以帮助我吗? 谢谢!
我遇到过同样的问题。 服务器响应附带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
。