很常见的需求:一个登录请求过来后验证通过后要给 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 再删掉
}
这种方法也很难受,说不上具体,总之就是非常难受
所以还有其他方法吗