Cookies
Cookies
HTTP cookie 是由用户浏览器存储的一小段数据。Cookies 被设计为网站记住状态信息的可靠机制。当用户再次访问网站时,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用于签名 cookies 的字符串或数组。这是可选的,如果未指定,将不会解析已签名的 cookies。如果提供字符串,则将其用作密钥。如果提供数组,将按顺序尝试使用每个密钥来取消签名 cookie。options作为第二个选项传递给cookie.parse的对象。有关更多信息,请参阅 cookie。
中间件将解析请求上的 Cookie 标头,并将 cookie 数据作为属性 req.cookies 公开,如果提供了密钥,则作为属性 req.signedCookies 公开。这些属性是 cookie 名称到 cookie 值的名称值对。
当提供密钥时,此模块将取消签名并验证任何已签名的 cookie 值,并将这些名称值对从 req.cookies 移动到 req.signedCookies。已签名的 cookie 是值以 s: 为前缀的 cookie。签名验证失败的已签名 cookies 将具有值 false 而不是被篡改的值。
有了这个设置,您现在可以在路由处理程序中读取 cookies,如下所示:
@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', // 用于 cookies 签名
});
有了这个设置,您现在可以在路由处理程序中读取 cookies,如下所示:
@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')
}
要了解更多关于 FastifyReply#setCookie() 方法的信息,请查看此页面。
警告 如果您想将响应处理逻辑留给框架,请记住将 passthrough 选项设置为 true,如上所示。阅读更多这里。
提示 @Res() 装饰器从 @nestjs/common 导入,而 FastifyReply 从 fastify 包导入。
创建自定义装饰器(跨平台)
为了提供一种方便的、声明式的方式来访问传入的 cookies,我们可以创建一个自定义装饰器。
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 对象中提取所有 cookies 或指定名称的 cookie,并用该值填充装饰的参数。
有了这个设置,我们现在可以在路由处理程序签名中使用装饰器,如下所示:
@Get()
findAll(@Cookies('name') name: string) {}