企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## `Cookies` 一个`HTTP cookie`是指存储在用户浏览器中的一小段数据。`Cookies`被设计为创建一种可靠的机制让网站来记录状态信息。当用户再次访问网站时,发出的请求会自带`cookie`。 ### 在`Express`中使用(默认) 首先安装需要的包(以及`TypeScript`用户需要的类型包): ```bash $ npm i cookie-parser $ npm i -D @types/cookie-parser ``` 安装完成后,将`cookie-parser`配置为全局中间件(例如在`main.ts`文件中)。 ```TypeScript import * as cookieParser from 'cookie-parser'; // somewhere in your initialization file app.use(cookieParser()); ``` 可以向`cookieParser`中间件中传递一些参数: - `secret`: 一个字符串或者数组,用来给`cookie`签名。如果不指定这个选项,将不解析签名的`cookie`。如果提供了一个字符串,那么它会被用来作为`secret`。如果提供了一个数组,将尝试依次使用其元素来作为`secret`解析`cookie`。 - `option`:一个作为第二个参数传递给`cookie.parse`的对象,参见`[cookie](https://www.npmjs.org/package/cookie)`来了解更多内容。 该中间件将从请求的头文件中解析`Cookie`并将其数据作为`req.cookies`暴露出来。如果提供了`secret`,将暴露为`req.signedCookies`。这些属性以`cookie`名称和属性的键值对保存。 当提供了`secret`时,该中间件将解析并验证所有签名的`cookie`并将其值从`req.cookies`移动到`req.signedCookies`。签名`cookie`是指包含`s:`前缀的`cookie`。验证失败的签名`cookie`值会被替换为`false`而不是被篡改过的值。 当这些完成后,就可以从路径处理程序中读取`cookie`了,例如: ```TypeScript @Get() findAll(@Req() request: Request) { console.log(request.cookies); // or "request.cookies['cookieKey']" // or console.log(request.signedCookies); } ``` > `@Req()`装饰器从`@nestjs/common`中引入,`Request`从`express`中引入。 要在输出的响应中附加`cookie`,使用`Response#cookie()`方法: ```TypeScript @Get() findAll(@Res({ passthrough: true }) response: Response) { response.cookie('key', 'value') } ``` > 如果你想把相应处理逻辑留给框架,需要将`passthrough`参数设置为`true`,如上所示。参见[这里](https://docs.nestjs.com/controllers#appendix-library-specific-approach) > `@Res()`装饰器从`@nestjs/common`中引入,`Response`从`express`中引入。 ### 在`Fastify`中使用 首先安装需要的包: ````bash npm i fastify-cookie ··· 安装完成后,注册`fastify-cookie`插件。 ```TypeScript import fastifyCookie from 'fastify-cookie'; // somewhere in your initialization file const app = await NestFactory.create<NestFastifyApplication>( AppModule, new FastifyAdapter(), ); app.register(fastifyCookie, { secret: 'my-secret', // for cookies signature }); ```` 当这些完成后,就可以从路径处理程序中读取`cookie`了,例如: ```TypeScript @Get() findAll(@Req() request: FastifyRequest) { console.log(request.cookies); // or "request.cookies['cookieKey']" } } ``` > `@Req()`装饰器从`@nestjs/common`中引入,`FastifyRequest`从`fastify`中引入。 要在输出的响应中附加`cookie`,使用`FastifyReply#setCookie()`方法: ```TypeScript @Get() findAll(@Res({ passthrough: true }) response: FastifyReply) { response.setCookie('key', 'value') } ``` 要了解更多`FastifyReply#setCookie()`,可参见[这里](https://github.com/fastify/fastify-cookie#sending)。 > 如果你想把相应处理逻辑留给框架,需要将`passthrough`参数设置为`true`,如上所示。参见[这里](https://docs.nestjs.com/controllers#appendix-library-specific-approach) > `@Res()`装饰器从`@nestjs/common`中引入,`FastifyReply`从`fastify `中引入。 ### 创建一个自定义装饰器(跨平台) 可以创建一个自定义装饰器,来提供一个方便易用、声明清晰的方式来处理`cookie`。 ```TypeScript 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; }, ); ``` 这个`@Cookie()`装饰器将解析所有`cookie`,或者从`req.cookie`对象中解析一个命名的`cookie`并用其值来填充解析的参数。 现在就可以使用该装饰器,从路径处理程序中读取`cookie`了,例如: ```TypeScript @Get() findAll(@Cookies('name') name: string) {} ```