logologo
文档仓库
文档仓库
logologo
开始

概述

第一步
控制器
提供者
模块
中间件
异常过滤器
管道
守卫
拦截器
自定义装饰器

基础

自定义提供程序
异步提供者
动态模块
注入作用域
循环依赖
模块引用
懒加载模块
执行上下文
生命周期事件
发现服务
平台无关
单元测试

技术

配置
SQL
Mongo
验证
缓存
序列化
版本控制
任务调度
队列
日志
Cookies
事件
压缩
文件上传
文件流
HTTP 模块
Session
MVC
性能(Fastify)
SSE

安全

认证
授权
加密与哈希
Helmet
CORS
CSRF
速率限制

GraphQL

快速开始
解析器
变更
订阅
标量
指令
接口
联合与枚举
字段中间件
类型映射
插件
复杂度
扩展
CLI 插件
生成SDL
共享模型
其他功能
联邦

WebSocket

网关
异常过滤器
管道
守卫
拦截器
适配器

微服务

基础
Redis
MQTT
NATS
RabbitMQ
Kafka
gRPC
自定义传输
异常过滤器
管道
守卫
拦截器
部署
独立应用程序

CLI

概述
工作区
库
用法
脚本

OpenAPI

介绍
装饰器
类型映射
操作
其他特性
安全
类型与参数
CLI 插件

实用示例

REPL
CRUD生成器
SWC
Passport(认证)
热重载
MikroORM
TypeORM
Mongoose
Sequelize
路由模块
Swagger
健康检查
CQRS
Compodoc
Prisma
Sentry
静态资源
Commander
异步本地存储
Necord
套件(原Automock)

常见问题

Serverless
HTTP 适配器
长连接
全局前缀
原始请求体
混合应用
HTTPS & 多服务器
请求生命周期
错误

开发工具

概述
CI/CD
迁移指南
API参考(官方)

生态与案例

谁在用
精彩资源

支持

支持

社区

贡献者

最后更新于: 2025/11/18 02:11:37

上一页HTTP 模块
下一页MVC

#会话

HTTP 会话提供了一种在多个请求间存储用户信息的方式,这对于 MVC 应用程序特别有用。

#与 Express 配合使用(默认)

首先安装所需包 (及其针对 TypeScript 用户的类型声明):

$ npm i express-session
$ npm i -D @types/express-session

安装完成后,将 express-session 中间件作为全局中间件应用(例如在您的 main.ts 文件中)。

import * as session from 'express-session';
// somewhere in your initialization file
app.use(
  session({
    secret: 'my-secret',
    resave: false,
    saveUninitialized: false,
  })
);
注意

默认的服务器端会话存储特意未设计用于生产环境。在大多数情况下会出现内存泄漏,无法扩展到单个进程之外,仅适用于调试和开发。更多信息请参阅官方仓库 。

secret 用于签署会话 ID cookie。可以是单个密钥的字符串,也可以是多个密钥的数组。如果提供了密钥数组,则只有第一个元素会用于签署会话 ID cookie,而在验证请求中的签名时将考虑所有元素。密钥本身不应容易被人工解析,最好是一组随机字符。

启用 resave 选项会强制将会话重新保存到会话存储中,即使在请求期间会话从未被修改过。默认值为 true,但使用默认值已被弃用,因为默认值将来会更改。

同样地,启用 saveUninitialized 选项会强制将"未初始化"的会话保存到存储中。当会话是新建但未被修改时即为未初始化状态。选择 false 有助于实现登录会话、减少服务器存储使用,或符合设置 cookie 前需获得许可的法律要求。选择 false 还能解决客户端在没有会话时发出多个并行请求导致的竞态条件问题( 来源 )。

你可以向 session 中间件传递其他多个选项,更多信息请参阅 API 文档 。

注意

请注意 secure: true 是一个推荐选项。但这要求网站启用 HTTPS,即安全 cookie 需要 HTTPS 协议。如果设置了 secure 选项却通过 HTTP 访问站点,cookie 将不会被设置。如果你的 node.js 部署在代理后方且使用 secure: true,则需要在 express 中设置 "trust proxy"。

完成上述配置后,你现在可以像下面这样在路由处理程序中设置和读取会话值:

@Get()
findAll(@Req() request: Request) {
  request.session.visits = request.session.visits ? request.session.visits + 1 : 1;
}
提示

@Req() 装饰器是从 @nestjs/common 导入的,而 Request 则来自 express 包。

或者,您也可以使用 @Session() 装饰器从请求中提取会话对象,如下所示:

@Get()
findAll(@Session() session: Record<string, any>) {
  session.visits = session.visits ? session.visits + 1 : 1;
}
提示

@Session() 装饰器是从 @nestjs/common 包导入的。

#与 Fastify 一起使用

首先安装所需包:

$ npm i @fastify/secure-session

安装完成后,注册 fastify-secure-session 插件:

import secureSession from '@fastify/secure-session';

// somewhere in your initialization file
const app = await NestFactory.create<NestFastifyApplication>(
  AppModule,
  new FastifyAdapter()
);
await app.register(secureSession, {
  secret: 'averylogphrasebiggerthanthirtytwochars',
  salt: 'mq9hDxBVDbspDR6n',
});
您也可以预生成密钥

( 查看说明 )或使用密钥轮换 。

更多可用选项请参阅官方仓库 。

完成这些设置后,您现在可以像下面这样在路由处理程序中设置和读取会话值:

@Get()
findAll(@Req() request: FastifyRequest) {
  const visits = request.session.get('visits');
  request.session.set('visits', visits ? visits + 1 : 1);
}

或者,您也可以使用 @Session() 装饰器从请求中提取会话对象,如下所示:

@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' )。