NestJS(Fastify)中间件中Cookie相关对象为undefined的问题求助
使用的技术版本
- NestJS CLI: 9.0.0
- NestJS Common & NestJS Platform Fastify: 9.0.11
- Fastify: 4.4.0
- @fastify/cookie: 8.0.0
问题描述
在中间件中尝试读取和设置Cookie时,发现request.cookies、response.setCookie、response.cookie均为undefined,但在控制器中这些对象和方法却能正常访问。
中间件代码
this.logger.debug("cookies", request.cookies) this.logger.debug("setCookie", response.setCookie) this.logger.debug("cookie", response.cookie)
中间件日志输出
DEBUG [DeviceMiddleware] cookies DEBUG [DeviceMiddleware] undefined DEBUG [DeviceMiddleware] setCookie DEBUG [DeviceMiddleware] undefined DEBUG [DeviceMiddleware] cookie DEBUG [DeviceMiddleware] undefined
控制器日志输出
DEBUG [AppController] cookies DEBUG [AppController] Object: {} DEBUG [AppController] setCookie DEBUG [AppController] function setCookie (name, value, cookieOptions) { const opts = Object.assign({}, options.parseOptions, cookieOptions) return fastifyCookieSetCookie(this, name, value, opts, signer) } DEBUG [AppController] cookie DEBUG [AppController] function setCookie (name, value, cookieOptions) { const opts = Object.assign({}, options.parseOptions, cookieOptions) return fastifyCookieSetCookie(this, name, value, opts, signer) }
原因分析与解决方法
核心原因是@fastify/cookie插件的注册时机晚于中间件,导致中间件执行时,Fastify还未完成Cookie相关的请求/响应对象增强。
解决步骤
- 提前注册Cookie插件:在
main.ts中先注册@fastify/cookie,再挂载中间件,确保插件逻辑先于中间件执行:
import { NestFactory } from '@nestjs/core'; import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify'; import fastifyCookie from '@fastify/cookie'; import { AppModule } from './app.module'; import { DeviceMiddleware } from './middleware/device.middleware'; async function bootstrap() { const app = await NestFactory.create<NestFastifyApplication>( AppModule, new FastifyAdapter(), ); // 优先注册cookie插件 await app.register(fastifyCookie); // 再注册中间件 app.use(new DeviceMiddleware().use); await app.listen(3000); } bootstrap();
- 替换为拦截器:若中间件注册顺序无法调整,可改用NestJS拦截器。拦截器的执行时机晚于Fastify插件注册,能正常访问Cookie相关方法。
内容的提问来源于stack exchange,提问作者armada45
相关产品推荐
相关产品推荐

