nestjs 如何优雅地给 response 设置 header?
很常见的需求:一个登录请求过来后验证通过后要给 response 的 header 设置 token
我找到了 2 种方法但都不满意不优雅
方法一
按照文档来
@Post('login') async login (@Body() param,@Res res) { const data={} res.set('token','')//这里设置 response 没问题 //但是啊下面的 return 就无效了!! //你必须自己手动操作 res.json().send()去给客户端返回数据 //还有副作用是拦截器不正常了 return {data} }
很难受,这种方法太怪胎了,还有副作用,弃之
方法二
用拦截器来帮忙设置 header
Injectable() export class SetTokenInterceptor implements NestInterceptor { intercept (context: ExecutionContext, next: CallHandler): Observable<any> { return next.handle().pipe(tap(result => { if (result?.token) { const http = context.switchToHttp() const res = http.getResponse() res.set('token', result.token) delete result.token //这里要删掉 token,因为我不希望 token 返回到 respoonse 的 body 中 } })) } }
@Post('login') @UseInterceptors(SetTokenInterceptor) async login (@Body() param) { const data={} return {data,token:''} //问题在于怎么把 token 传给拦截器? //只能带在返回数据里,然后拦截器拿到 token 再删掉 }
这种方法也很难受,说不上具体,总之就是非常难受
所以还有其他方法吗