如何在NestJS响应中设置请求头字段?遇res.headers.set未定义错误
解决NestJS登录接口设置响应头报错的问题
这个TypeError: Cannot read property 'set' of undefined错误,本质是你对NestJS中响应对象的API用法理解有误,咱们直接来修正:
正确的实现代码
你需要调整两处细节:一是用Express响应对象的标准方法设置响应头,二是如果想保留Nest自动处理返回值(比如序列化)的能力,要给@Res()加上passthrough: true选项。修改后的代码如下:
@Post('login') async login( @Body() body: AuthDto, @Res({ passthrough: true }) res: Response ) { const loginResponse = await this.authService.login(body); console.log('loginResponse', loginResponse); // 使用Express响应对象的set()方法设置响应头 res.set('x-access-token', loginResponse.access_token); return loginResponse; }
为什么之前的代码会报错?
你之前尝试用res.headers.set(),这里存在两个关键误区:
- 在Express的响应对象中,根本没有
res.headers.set()这个API,设置响应头的正确方式是res.set()或者res.header()(这两个方法功能完全等价)。 - 另外,
res.headers其实是请求对象(req)的属性,用来读取前端发送的请求头信息,而非设置响应头的入口,所以你访问res.headers会得到undefined,调用set()自然就抛出了错误。
可选替代方案(无需直接操作响应对象)
如果不想手动处理响应对象,也可以通过NestJS的拦截器来统一处理响应头,但对于单个接口的动态头设置,上面的方法会更直接高效。
内容的提问来源于stack exchange,提问作者Shamoon
相关产品推荐
相关产品推荐

