NestJS Cookies

2023-09-08 17:41 更新

HTTP cookie 是用戶瀏覽器存儲(chǔ)的一小段數(shù)據(jù)。 Cookie 旨在成為網(wǎng)站記住狀態(tài)信息的可靠機(jī)制。 當(dāng)用戶再次訪問網(wǎng)站時(shí),cookie 會(huì)自動(dòng)隨請(qǐng)求一起發(fā)送。

與 Express 一起使用(默認(rèn))

首先安裝所需的包(以及 TypeScript 用戶的類型):

$ npm i cookie-parser
$ npm i -D @types/cookie-parser

安裝完成后,將 cookie-parser 中間件應(yīng)用為全局中間件(例如,在 main.ts 文件中)。

import * as cookieParser from 'cookie-parser';
// 在初始化文件的地方
app.use(cookieParser());

你可以將幾個(gè)選項(xiàng)傳遞給 cookieParser 中間件:

  • secret 用于簽署 cookie 的字符串或數(shù)組。這是可選的,如果未指定,將不會(huì)解析簽名的 cookie。如果提供了字符串,則將其用作密鑰。如果提供了一個(gè)數(shù)組,則將嘗試按順序使用每個(gè)密鑰對(duì) cookie 取消簽名。
  • options 作為第二個(gè)選項(xiàng)傳遞給 cookie.parse 的對(duì)象。

中間件將解析請(qǐng)求上的 Cookie 標(biāo)頭,并可以使用 req.cookies 訪問 cookie 數(shù)據(jù),如果提供了密鑰,則使用屬性 req.signedCookies 訪問簽名的cookie。這些屬性是 cookie 名稱到 cookie 值的鍵值對(duì)。

當(dāng)提供密鑰時(shí),此模塊將取消簽名并驗(yàn)證任何已簽名的 cookie 值,并將這些名稱值對(duì)從 req.cookies 移動(dòng)到 req.signedCookies。簽名 cookie 是一個(gè)值以 s: 為前綴的 cookie。簽名驗(yàn)證失敗的簽名 cookie 將具有值 false 而不是被篡改的值。

有了這個(gè),我們現(xiàn)在可以從路由處理程序中讀取 cookie,如下所示:

@Get()
findAll(@Req() request: Request) {
  console.log(request.cookies); // 或者 "request.cookies['cookieKey']"
  // 或者 console.log(request.signedCookies);
}
提示 : @Req() 裝飾器是從 @nestjs/common 導(dǎo)入的,而 Request 是從 express 包導(dǎo)入的。

要將 cookie 附加到傳出響應(yīng),請(qǐng)使用 Response#cookie() 方法:

@Get()
findAll(@Res({ passthrough: true }) response: Response) {
  response.cookie('key', 'value')
}
警告 如果想將響應(yīng)處理邏輯留給框架,請(qǐng)記住將 passthrough 選項(xiàng)設(shè)置為 true,如上所示。
@Res() 裝飾器是從 @nestjs/common 導(dǎo)入的,而 Response 是從 express 包導(dǎo)入的。

與 Fastify 一起使用

首先安裝所需的包:

$ npm i fastify-cookie

安裝完成后,注冊(cè) fastify-cookie 插件:

import fastifyCookie from 'fastify-cookie';

// 在你的初始化文件的地方
const app = await NestFactory.create<NestFastifyApplication>(
  AppModule,
  new FastifyAdapter(),
);
await app.register(fastifyCookie, {
  secret: 'my-secret', // 用于 cookie 簽名
});

有了這個(gè),我們現(xiàn)在可以從路由處理程序中讀取 cookie,如下所示:

@Get()
findAll(@Req() request: FastifyRequest) {
  console.log(request.cookies); // 或者 "request.cookies['cookieKey']"
}
@Req() 裝飾器是從 @nestjs/common 導(dǎo)入的,而 FastifyRequest 是從 fastify 包導(dǎo)入的。

要將 cookie 附加到傳出響應(yīng),請(qǐng)使用 FastifyReply#setCookie() 方法:

@Get()
findAll(@Res({ passthrough: true }) response: FastifyReply) {
  response.setCookie('key', 'value')
}
警告 如果我們想將響應(yīng)處理邏輯留給框架,請(qǐng)記住將 passthrough 選項(xiàng)設(shè)置為 true 。
@Res() 裝飾器是從 @nestjs/common 導(dǎo)入的,而 FastifyReply 是從 fastify 包導(dǎo)入的。

創(chuàng)建自定義裝飾器(跨平臺(tái))

為了提供一種方便的、聲明式的方式來訪問傳入的 cookie,我們可以創(chuàng)建一個(gè)自定義裝飾器 。

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;
  },
);

@Cookies() 裝飾器將從 req.cookies 對(duì)象中提取所有 cookie 或命名 cookie,并使用該值填充裝飾參數(shù)。

有了這個(gè),我們現(xiàn)在可以在路由處理程序簽名中使用裝飾器,如下所示:

@Get()
findAll(@Cookies('name') name: string) {}


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)