HTTP cookie 是用戶瀏覽器存儲(chǔ)的一小段數(shù)據(jù)。 Cookie 旨在成為網(wǎng)站記住狀態(tài)信息的可靠機(jī)制。 當(dāng)用戶再次訪問網(wǎng)站時(shí),cookie 會(huì)自動(dòng)隨請(qǐng)求一起發(fā)送。
首先安裝所需的包(以及 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 中間件:
中間件將解析請(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)入的。
首先安裝所需的包:
$ 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)入的。
為了提供一種方便的、聲明式的方式來訪問傳入的 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) {}
更多建議: