很常见的需求:一个登录请求过来后验证通过后要给 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 再删掉
}
这种方法也很难受,说不上具体,总之就是非常难受
所以还有其他方法吗
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.