ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## `Session(会话)` `HTTP session`提供了一个用于在不同请求间存储信息的方法,这在`MVC`架构应用中非常有用。 ### 在`Express`中使用(默认) 首先安装需要的包(以及`TypeScript`用户需要的类型包): ```bash $ npm i express-session $ npm i -D @types/express-session ``` 安装完成后,将`express-session`配置为全局中间件(例如在`main.ts`文件中)。 ```TypeScript import * as session from 'express-session'; // somewhere in your initialization file app.use( session({ secret: 'my-secret', resave: false, saveUninitialized: false, }), ); ``` > 在生产环境中,有意的默认不在服务器端提供会话存储。因为这在很多场合下会造成内存泄漏,不能扩展到单个进程,因此仅用于调试和开发环境。参见[官方仓库](https://github.com/expressjs/session)。 `secret`用于加密该会话 ID`cookie`,它可以是一个字符串用于单一加密,或者数组用来多重加密。如果提供了一个数组,只有第一个元素被用来加密会话 ID`cookie`,其他元素将被用于验证签名请求。密码本身不应该过于容易被人工解析,最好使用一组随机字符。 使能`resave`选项会强制重新保存会话即使在请求过程中它未被修改过。其默认值为`true`,但不赞成使用默认值,在未来这个默认值将被修改。 类似地,使能`saveUninitialized`选项将强制存储一个未初始化的会话。一个未初始化的会话可能是一个新的尚未修改的会话。配置为`false`用于登陆会话是很有用的,可以减少服务器存储,或者遵循法律规定在存储用户`cookie`前需要获得用户授权。配置为`false`在一个客户端在无会话情况下建立多个请求的状况下会很有用。参见[这里](https://github.com/expressjs/session#saveuninitialized)。 还可以给`session`中间件传递更多参数,参见[API 文档](https://github.com/expressjs/session#options)。 > 注意`secure:true`是推荐选项。然而,它需要启用了`https`的网站,也就是说,`HTTPS`对安全`cookie`来说是必须的。如果配置了`secure`,但是通过`HTTP`访问网站,将不会保存`cookie`。如果你的`node.js`在代理之后,并且启用了`secure:true`选项,你需要在`express`中配置`trust proxy`选项。 当这些完成后,就可以从路径处理程序中读取`session`了,例如: ```TypeScript @Get() findAll(@Req() request: Request) { req.session.visits = req.session.visits ? req.session.visits + 1 : 1; } ``` > `@Req()`装饰器从`@nestjs/common`中引入,`@Request`从`express`中引入。 另外,你也可以使用`@Session()`装饰器来从请求解压一个`session`对象: ```TypeScript @Get() findAll(@Session() session: Record<string, any>) { session.visits = session.visits ? session.visits + 1 : 1; } ``` ### 在`Fastify`中使用 首先安装需要的包: ```bash $ npm i fastify-secure-session ``` 安装完成后,注册`fastify-secure-session`插件。 ```TypeScript import secureSession from 'fastify-secure-session'; // somewhere in your initialization file const app = await NestFactory.create<NestFastifyApplication>( AppModule, new FastifyAdapter(), ); app.register(secureSession, { secret: 'averylogphrasebiggerthanthirtytwochars', salt: 'mq9hDxBVDbspDR6n', }); ```` > 你也可以预先生成一个`key`(参见[指南](https://github.com/fastify/fastify-secure-session))或者使用[key 变化](https://github.com/fastify/fastify-secure-session#using-keys-with-key-rotation)。 [在官方存储库](https://github.com/fastify/fastify-secure-session)中阅读有关可用选项的更多信息。 当这些完成后,就可以从路径处理程序中读取`session`了,例如: ```TypeScript @Get() findAll(@Req() request: FastifyRequest) { const visits = request.session.get('visits'); request.session.set('visits', visits ? visits + 1 : 1); } ``` > `@Req()`装饰器从`@nestjs/common`中引入,`FastifyRequest`从`fastify`中引入。 另外,你也可以使用`@Session()`装饰器来从请求解压一个`session`对象: ```TypeScript @Get() findAll(@Session() session: secureSession.Session) { const visits = session.get('visits'); session.set('visits', visits ? visits + 1 : 1); } ``` > `@Session()`装饰器从`@nestjs/common`中引入,`secureSession.Session`从`fastify-secure-session`中引入。(引入语句: `import * as secureSession from 'fastify-secure-session'`).