简介
cookie-parser是Express最常使用的中间件,实际上虽然他名义上是一个中间件但是实际上已经俨然成为了Express的一个不可或缺的部分.
在Express4的文档中,操作Cookie的部分就一个方法和一个属性.但是实际上如果你不使用cookie-parser中间件这些方法是根本就不存在的.
先从Express操作cookie说起
如果有一个纯净的Express,像这样:
const app = new express();
app.get('/login', (request, response) => {
response.send('hello express');
});
app.listen(8888, '127.0.0.1');
我们如何操纵cookie?,显然只能在request
和response
中操纵.
express在request
提供了:
- cookies {Object}
在response
提供了:
- res.cookie(name, value [, options])
简单来讲一个用于获取另外一个用于写入.
但是一切的前提就是你得使用cookie-parser中间件的前提下才可以拥有这个属性和方法,之前我就被坑了.
在上面的极简实例中我们得使用:
app.get('/login', (request, response) => {
console.log(request.headers.cookie);
response.send('hello express');
});
才可以获取没有使用cookie-parser中间件时候的cookie.
cookie-parser的具体功能
- 已键值对的形式的获取cookie
- 使用简单的方法设置cookie
- 对于cookie进行签名
调用参数
cookie-parser在初始化的时候和写入cookie的时候允许传入参数.
在初始化的时候允许传入:
参数 | 类型 | 描述 | |
---|---|---|---|
secret | string | string[] | 用于签名cookie的字符串 |
options | object | 选项基于cookie模块 |
cookie方法参数
基本格式如下res.cookie(name, value [, options])
.
其中第一个参数是name
是cookie的键,而value
是键对应的的值.
options有如下的选项,基本都是cookie在HttpHeader中的参数:
参数 | 类型 | 描述 |
---|---|---|
domain | string | 描述cookie作用的主机 |
path | stirng | 只有在匹配成功的地址才会发送cookie默认 / |
encode | function | 用于cookie的编码默认是encodeURIComponent |
expires | date | 使用GMT格式的时间来指定过期时间 |
maxAge | number | 指定多好毫秒后cookie失效 |
httpOnly | boolean | 设置后客户端无法访问cookie的内容 |
secure | boolean | 标记这个cookie只有在https协议下起作用 |
signed | boolean | 对于cookie进行签名 |
sameSite | boolean | 阻止cookie在跨站请求的时候发送 |
在MDN中有cookie的详细解释,上面除了signed
外都有介绍.
使用示例
基本示例:
const express = require('express');
const cookieParse = require('cookie-parser');
const app = new express();
app.use(cookieParse());
app.get('/login', (request, response) => {
// 以键值对的形式获取所有的cookie
console.log(reqeust.cookies);
// 写入cookie
response.cookie('key', 'value');
response.send('hello express');
});
app.listen(8888, '127.0.0.1');
使用cookie签名:
const express = require('express');
const cookieParse = require('cookie-parser');
const app = new express();
// 传入一个字符串对cookie进行签名
app.use(cookieParse('hello world'));
app.get('/login', (request, response) => {
// 获取没有签名的cookie
console.log(request.cookies);
// 获取签名的cookie
console.log(request.signedCookies);
// 写入签名cookie
response.cookie('signed', 'true', {maxAge: 100000,signed:true});
// 写入未签名cookie
response.cookie('key', 'value');
response.send('hello express');
});
app.listen(8888, '127.0.0.1');