在Express中使用Cookie

文章来自于我在express框架上使用cookie引发的一些问题,但在具体介绍cookie以及如何正确的使用cookie之前,我觉得我有必要说一说cookie到底是什么。

Cookie是服务器保存在浏览器中的一段小(一般而言size<4KB)的文本信息,而浏览器每次想服务器发出请求,就会携带上这段信息。Cookie一般包含了key、value、到期时间、所属域名、所属路径等信息。

在浏览器中我们只需要使用document.cookie来得到当前页面所属的cookie。请注意,返回的cookie是以字符串形式存在的,不同的key-value之间通过’;’来分割,所以如果你想对齐进行进一步操作,需要相应的处理。

这里需要注意的是,document.cookie属性是可写的,这就意味着你可以手动添加cookie,使用document.cookie="name=value"的形式。注意,这里是添加,而不产生覆盖。

好了,关于cookie的属性的具体含义和用法,大家可以自行去了解。

我的问题

我在使用服务器端使用cookie的时候出现了问题,出现这样问题的原因很简单,首先我对cookie存在错误的理解,请务必注意,cookie是服务器发送给客户端,而客户端在发起请求的时候携带cookie而已。在正确认识cookie之后,并且成功的将cookie发送到浏览器过后,问题又来了,我在请求的时候,cookie却不能发送到服务端。我使用的是下面一段代码:

1
2
3
4
5
6
7
8
9
10
fetch('/login?'+stringify_data, {
method: 'GET'
}).then(function(res) {
return res.json();
}).then(function(json){
console.log(json.status);
}).catch(function(err) {
console.log('oh ! error!')
})
}

这里我使用了fetch API,在能够正确的发送请求的情况下,服务器无法读取到相应的cookie信息,同样在chrome开发者工具中查看请求头也发现请求并没有携带cookie信息。我想着一定是fetch API的问题,所以我赶快写了一个使用Ajax的请求,很显然,能够正确的发起携带cookie的请求。好吧,写到现在,我想的确是fetch API的问题了,阅读文档发现fetch API发送的请求默认是不带cookie的,必须手动设置(无论是出于什么样的考虑,但还是觉得坑)!好吧,问题迎刃而解,我们只需要在fetch函数第二个参数设置credentials: 'include'就可以发送cookie了/无奈!

在express中使用cookie

在express中使用cookie是一件十分惬意的事情,因为如果你使用cookie-parser中间件的话,那么我们只需要使用res.cookie(name, value[,options])就可以设置cookie了,关于options相关的参数可以自行学习!

如果想删除cookie,也很简单,使用res.clearCookie(name)就可以啦。

当然如果想获取请求头发过来的cookie,我们只需要使用req.cookies就可以了,这里返回的是一个JS对象,我们直接可以使用name来读取值,从而做进一步的操作。

在使用了cookie-parser中间件过后,在服务端操作cookie已经足够简单,并且cookie-parser不但提供了非签名使用的方式,还提供了签名的使用方式,具体使用是在使用中间件的时候添加一个secret,app.use(cookieParser('secret'))即可,当然,在获取cookie的时候使用 req.signedCookies属性就好了。

好了,如果你不想使用cookie-parser,我们也能够通过req.headers.cookies(感到罪恶所以不推荐/无奈)访问到cookie,如果想写cookie的话,使用res.setHeader(name, value)(再次感到罪恶)或者res.writeHead(status[,options])就可以了…

尾巴

一般情况下,文章末尾,我总会写一点鸡汤/无奈,这次也不例外。距离写上一篇博客已经过了很久了,起初有两篇想写的文章,一篇是在RN中使用Navigator,另外一篇则是介绍我自己正在学习的几种分类算法。可是当创建好文件准备开工时,我因为写一篇文章可能需要2-3个小时(我速度慢)或者是因为真的动笔写的时候反而觉得没什么要说的就放弃了。然后一段时间过后,或许是因为忙,或许是因为懒,或许是因为浮躁,就是没有去实践,没有去巩固,而把一切都抛之脑后,然后把前面学习到的忘得一干二净!

嗯,这的确的真实的!仅此而已!

END

分享到 评论