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

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

http cookie 是用户浏览器存储的一小段数据。 cookie 旨在成为网站记住状态信息的可靠机制。 当用户再次访问网站时,cookie 会自动随请求一起发送。

与 express 一起使用(默认)

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

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

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

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

你可以将几个选项传递给 cookieparser 中间件:

  • secret 用于签署 cookie 的字符串或数组。这是可选的,如果未指定,将不会解析签名的 cookie。如果提供了字符串,则将其用作密钥。如果提供了一个数组,则将尝试按顺序使用每个密钥对 cookie 取消签名。
  • options 作为第二个选项传递给 cookie.parse 的对象。

中间件将解析请求上的 cookie 标头,并可以使用 req.cookies 访问 cookie 数据,如果提供了密钥,则使用属性 req.signedcookies 访问签名的cookie。这些属性是 cookie 名称到 cookie 值的键值对。

当提供密钥时,此模块将取消签名并验证任何已签名的 cookie 值,并将这些名称值对从 req.cookies 移动到 req.signedcookies。签名 cookie 是一个值以 s: 为前缀的 cookie。签名验证失败的签名 cookie 将具有值 false 而不是被篡改的值。

有了这个,我们现在可以从路由处理程序中读取 cookie,如下所示:

@get()
findall(@req() request: request) {
  console.log(request.cookies); // 或者 "request.cookies['cookiekey']"
  // 或者 console.log(request.signedcookies);
}

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

要将 cookie 附加到传出响应,请使用 response#cookie() 方法:

@get()
findall(@res({ passthrough: true }) response: response) {
  response.cookie('key', 'value')
}

警告 如果想将响应处理逻辑留给框架,请记住将 passthrough 选项设置为 true,如上所示。

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


与 fastify 一起使用

首先安装所需的包:

$ npm i fastify-cookie

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

import fastifycookie from 'fastify-cookie';
// 在你的初始化文件的地方
const app = await nestfactory.create(
  appmodule,
  new fastifyadapter(),
);
await app.register(fastifycookie, {
  secret: 'my-secret', // 用于 cookie 签名
});

有了这个,我们现在可以从路由处理程序中读取 cookie,如下所示:

@get()
findall(@req() request: fastifyrequest) {
  console.log(request.cookies); // 或者 "request.cookies['cookiekey']"
}

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

要将 cookie 附加到传出响应,请使用 fastifyreply#setcookie() 方法:

@get()
findall(@res({ passthrough: true }) response: fastifyreply) {
  response.setcookie('key', 'value')
}

警告 如果我们想将响应处理逻辑留给框架,请记住将 passthrough 选项设置为 true

@res() 装饰器是从 @nestjs/common 导入的,而 fastifyreply 是从 fastify 包导入的。


创建自定义装饰器(跨平台)

为了提供一种方便的、声明式的方式来访问传入的 cookie,我们可以创建一个自定义装饰器

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 对象中提取所有 cookie 或命名 cookie,并使用该值填充装饰参数。

有了这个,我们现在可以在路由处理程序签名中使用装饰器,如下所示:

@get()
findall(@cookies('name') name: string) {}

查看笔记

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