NestJS Session(會話)

2023-09-08 17:41 更新

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,
  }),
);
注意 默認的服務器端會話存儲故意不是為生產環(huán)境設計的。 它在大多數(shù)情況下會泄漏內存,不會擴展到單個進程,并且用于調試和開發(fā)。

密鑰用于簽署會話 ID cookie。這可以是單個密鑰的字符串,也可以是多個密鑰的數(shù)組。如果提供了一個密鑰數(shù)組,則只有第一個元素將用于簽署會話 ID cookie,而在驗證請求中的簽名時將考慮所有元素。密鑰本身不應被別人輕易解析,最好是一組隨機字符。

啟用 resave 選項會強制將會話保存回會話存儲區(qū),即使在請求期間從未修改過會話。默認值為 true,但不推薦使用默認值,因為默認值將來會更改。

同樣,啟用 saveUninitialized 選項會強制將“未初始化”的會話保存到存儲中。當一個會話是新的但未被修改時,它是未初始化的。選擇 false 對于實現(xiàn)登錄會話、減少服務器存儲使用或遵守在設置 cookie 之前需要許可的法律很有用。選擇 false 還有助于解決競爭條件,即客戶端在沒有會話的情況下發(fā)出多個并行請求。

我們可以將其他幾個選項傳遞給會話中間件。

注意 : secure: true 是推薦的選項。 但是,它需要啟用 https 的網(wǎng)站,即安全 cookie 需要 HTTPS。 如果設置了安全,并且通過 HTTP 訪問我們的站點,則不會設置 cookie。 如果 node.js 位于代理后面并且使用的是 secure: true,則需要在 express 中設置“信任代理”。

有了這個,我們現(xiàn)在可以從路由處理程序中設置和讀取會話值,如下所示:

@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<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';

// 在你初始化文件的地方
const app = await NestFactory.create<NestFastifyApplication>(
  AppModule,
  new FastifyAdapter(),
);
await app.register(secureSession, {
  secret: 'averylogphrasebiggerthanthirtytwochars',
  salt: 'mq9hDxBVDbspDR6n',
});
我們還可以預先生成密鑰或使用密鑰輪換。

在官方存儲庫中閱讀有關可用選項的更多信息。

有了這個,我們現(xiàn)在可以從路由處理程序中設置和讀取會話值,如下所示:

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


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號