NestJS搭配FastifyAdapter调用res.cookie报not a function错误
报错原因
报错核心原因是框架生态不匹配:
- 你当前项目使用Fastify作为HTTP底层框架,而非Express。
cookie-parser是Express专属的中间件,无法在Fastify中正常生效,强行通过app.use()挂载不会给响应对象注入Cookie操作方法。 - 你从
express包引入的Response类型和Fastify实际注入的响应实例(Fastify Reply对象)API完全不一致:Express的响应对象自带cookie()方法,而Fastify原生响应对象没有该方法,调用时自然抛出类型错误。
修复方案
- 第一步:替换依赖
先卸载不兼容的Express生态Cookie包,安装Fastify官方维护的Cookie插件:npm uninstall cookie-parser @types/cookie-parser npm install @fastify/cookie - 第二步:修改应用初始化逻辑
删除原来挂载cookieParser的代码,改为注册Fastify官方Cookie插件,注意注册插件需要加await保证加载完成:import { NestFactory } from '@nestjs/core'; import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify'; import fastifyCookie from '@fastify/cookie'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create<NestFastifyApplication>( AppModule, new FastifyAdapter(), ); // 注册Fastify Cookie插件,替代Express的cookie-parser await app.register(fastifyCookie); await app.listen(3000); } bootstrap(); - 第三步:修改接口内的Cookie操作逻辑
删除从express包引入Response的代码,将响应对象类型替换为Fastify的响应类型,调用Fastify提供的setCookie方法设置Cookie:import { Post, Body, ValidationPipe, Res } from '@nestjs/common'; import { FastifyReply } from 'fastify'; // 其他业务依赖引入... @Post('login') signIn ( @Body(ValidationPipe) credentials: Credentials, @Res({ passthrough: true }) res: FastifyReply ) { // Fastify通过setCookie方法设置Cookie,参数顺序为key、value、配置项 res.setCookie('test', 2, { // 可按需配置Cookie属性,例: httpOnly: true, path: '/', maxAge: 24 * 60 * 60 * 1000 }); return this.localAuthService.signInUser(credentials); }
补充说明:如果后续需要读取请求中的Cookie,直接从Fastify请求对象上取
request.cookies即可,和Express的使用体验基本一致。
内容的提问来源于stack exchange,提问作者michalgrzegorczyk-dev
相关产品推荐
相关产品推荐

