Nest.js Cookie
HTTP cookie 是用户浏览器存储的一小段数据。 Cookie 旨在成为网站记住状态信息的可靠机制。 当用户再次访问网站时,cookie 会自动随请求一起发送。
与 Express 一起使用(默认)
首先安装所需的包(以及 TypeScript 用户的类型):
$ npm i cookie-parser
$ npm i -D @types/cookie-parser
安装完成后,将 cookie-parser
中间件应用为全局中间件(例如,在 main.ts 文件中)。
import * as cookieParser from 'cookie-parser';
// 在初始化文件的地方
app.use(cookieParser());
你可以将几个选项传递给 cookieParser 中间件:
secret
用于签署 cookie 的字符串或数组。这是可选的,如果未指定,将不会解析签名的 cookie。如果提供了字符串,则将其用作密钥。如果提供了一个数组,则将尝试按顺序使用每个密钥对 cookie 取消签名。options
作为第二个选项传递给 cookie.parse 的对象。
中间件将解析请求上的 Cookie 标头,并可以使用 req.cookies 访问 cookie 数据,如果提供了密钥,则使用属性 req.signedCookies 访问签名的cookie。这些属性是 cookie 名称到 cookie 值的键值对。
当提供密钥时,此模块将取消签名并验证任何已签名的 cookie 值,并将这些名称值对从 req.cookies 移动到 req.signedCookies。签名 cookie 是一个值以 s:
为前缀的 cookie。签名验证失败的签名 cookie 将具有值 false 而不是被篡改的值。
有了这个,我们现在可以从路由处理程序中读取 cookie,如下所示:
@Get()
findAll(@Req() request: Request) {
console.log(request.cookies); // 或者 "request.cookies['cookieKey']"
// 或者 console.log(request.signedCookies);
}
提示
: @Req() 装饰器是从 @nestjs/common 导入的,而 Request 是从 express 包导入的。
要将 cookie 附加到传出响应,请使用 Response#cookie()
方法:
@Get()
findAll(@Res({ passthrough: true }) response: Response) {
response.cookie('key', 'value')
}
警告
如果想将响应处理逻辑留给框架,请记住将passthrough
选项设置为 true,如上所示。
@Res() 装饰器是从 @nestjs/common 导入的,而 Response 是从 express 包导入的。
与 Fastify 一起使用
首先安装所需的包:
$ npm i fastify-cookie
安装完成后,注册 fastify-cookie 插件:
import fastifyCookie from 'fastify-cookie';
// 在你的初始化文件的地方
const app = await NestFactory.create<NestFastifyApplication>(
AppModule,
new FastifyAdapter(),
);
await app.register(fastifyCookie, {
secret: 'my-secret', // 用于 cookie 签名
});
有了这个,我们现在可以从路由处理程序中读取 cookie,如下所示:
@Get()
findAll(@Req() request: FastifyRequest) {
console.log(request.cookies); // 或者 "request.cookies['cookieKey']"
}
@Req() 装饰器是从 @nestjs/common 导入的,而 FastifyRequest 是从 fastify 包导入的。
要将 cookie 附加到传出响应,请使用 FastifyReply#setCookie()
方法:
@Get()
findAll(@Res({ passthrough: true }) response: FastifyReply) {
response.setCookie('key', 'value')
}
警告
如果我们想将响应处理逻辑留给框架,请记住将passthrough
选项设置为 true 。
@Res() 装饰器是从 @nestjs/common 导入的,而 FastifyReply 是从 fastify 包导入的。
创建自定义装饰器(跨平台)
为了提供一种方便的、声明式的方式来访问传入的 cookie,我们可以创建一个自定义装饰器 。
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const Cookies = createParamDecorator(
(data: string, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
return data ? request.cookies?.[data] : request.cookies;
},
);
@Cookies()
装饰器将从 req.cookies
对象中提取所有 cookie 或命名 cookie,并使用该值填充装饰参数。
有了这个,我们现在可以在路由处理程序签名中使用装饰器,如下所示:
@Get()
findAll(@Cookies('name') name: string) {}