教程 > nest.js 中文教程 > 阅读:319

nest.js session——迹忆客-ag捕鱼王app官网

http session 提供了一种跨多个请求存储用户信息的方法,这对于 mvc 应用程序特别有用。

与 express 一起使用(默认)

首先安装所需的包(以及 typescript 用户的类型):

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

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

import * as session from 'express-session';
// 在你初始化文件的地方
app.use(
  session({
    secret: 'my-secret',
    resave: false,
    saveuninitialized: false,
  }),
);

注意 默认的服务器端会话存储故意不是为生产环境设计的。 它在大多数情况下会泄漏内存,不会扩展到单个进程,并且用于调试和开发。

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

启用 resave 选项会强制将会话保存回会话存储区,即使在请求期间从未修改过会话。默认值为 true,但不推荐使用默认值,因为默认值将来会更改。

同样,启用 saveuninitialized 选项会强制将“未初始化”的会话保存到存储中。当一个会话是新的但未被修改时,它是未初始化的。选择 false 对于实现登录会话、减少服务器存储使用或遵守在设置 cookie 之前需要许可的法律很有用。选择 false 还有助于解决竞争条件,即客户端在没有会话的情况下发出多个并行请求。

我们可以将其他几个选项传递给会话中间件。

注意 : secure: true 是推荐的选项。 但是,它需要启用 https 的网站,即安全 cookie 需要 https。 如果设置了安全,并且通过 http 访问我们的站点,则不会设置 cookie。 如果 node.js 位于代理后面并且使用的是 secure: true,则需要在 express 中设置“信任代理”。

有了这个,我们现在可以从路由处理程序中设置和读取会话值,如下所示:

@get()
findall(@req() request: request) {
  request.session.visits = request.session.visits ? request.session.visits   1 : 1;
}

@req() 装饰器是从 @nestjs/common 导入的,而 request 是从 express 包导入的。

或者,我们可以使用 @session() 装饰器从请求中提取 session 对象,如下所示:

@get()
findall(@session() session: record) {
  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';
// 在你初始化文件的地方
const app = await nestfactory.create(
  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' )。

查看笔记

扫码一下
查看教程更方便
网站地图