跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • nestjs 如何优雅地给 response 设置 header?
未分類
2 11 月 2020

nestjs 如何优雅地给 response 设置 header?

nestjs 如何优雅地给 response 设置 header?

資深大佬 : rikka 2

很常见的需求:一个登录请求过来后验证通过后要给 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 再删掉 } 

这种方法也很难受,说不上具体,总之就是非常难受

所以还有其他方法吗

大佬有話說 (15)

  • 資深大佬 : zengming00

    老老实实用 express/koa,这风格一看就是 java 抄过来的,为什么要用 java 那套东西来复杂化 node.js

  • 主 資深大佬 : rikka

    @zengming00 #1 我在这里被众人安利 nestjs

  • 資深大佬 : gouflv

    token 直接放 json 返回咯

  • 資深大佬 : luob

    在后端给 response header 设置 token 没有任何意义

    供参考:

    @Post(‘login’)
    async login (@Body() param,@Res res) {
    const {username, password} = param
    const token =this.authService.validateUser(username, password)
    return { token }
    }

    @Get(‘/profile’)
    @UserRequired()
    async user (@CurrentUser() user) {
    return this.userService.getUser(user.id)
    }

    实现一下 @UserRequired()和 @CurrentUser()这两个注解即可

  • 主 資深大佬 : rikka

    @luob #4 怎么会没意义呢,我鉴权用 jwt 来做,就想 token 放在 response header 中给客户端去拿,极其常见的情况

    另外你第一段代码试过了吗,你一旦用 @Res 这个装饰器后面 return 就没用了

  • 資深大佬 : luob

    @rikka 那里是忘了删除,显然不需要 @Req 。

    大家都是
    客户端从 body 里拿到 token 保存到状态然后把 token 塞进每个请求里
    你为什么要
    客户端从 header 里挖 token 保存到状态然后把 token 塞进每个请求里

    你自己造了个 token/set-token 方案?你都这样玩了为什么不用 set-cookie 呢?

  • 主 資深大佬 : rikka

    @luob #6

    我也没啥特别的啊
    仅仅仅就想 token 放 header 里面给客户端拿而已
    为什么呢?因为客户端请求的时候会把 token 放在 header,所以为了对称美(狗头),下发 token 也想放 header 里面

  • 主 資深大佬 : rikka

    @luob #6 还有个好处忘了讲,比方 token 还剩 10 分种就过期了,客户端做其他业务请求的时候我想重新下发一个新 token 给他啊,放 header 里面就就非常合适

  • 主 資深大佬 : rikka

    业务交互数据放 body
    鉴权这种相对特殊的数据放 header

    难道不是更常见?

  • 主 資深大佬 : rikka

    @luob #6 卧槽,还在想怎么实现这个 @CurrentUser,然后就受到启发,我可以自己写个装饰器自己拿到 response 啊

    “`
    export const resp = createParamDecorator((data, ctx: ExecutionContext) => {
    return ctx.switchToHttp().getResponse()
    })

    @Post(‘login’)
    async login (@Body() param,@resp() resp:any) {
    const data={}
    resp.set(‘token’,”)
    return {data}
    }
    “`

    非常非常完美!!!

  • 資深大佬 : zy445566

    10L 这样不也一样有副作用,要想最没副作用,那就这个方法就单独做参数处理器,return 出来后,用一个出口方法了 merge 到 resp 上,这样副作用才最小

  • 資深大佬 : namelosw

    Nest 的设计就不是无副作用的

  • 主 資深大佬 : rikka

    @zy445566 #11 我说的副作用是指:只要用了 nestjs 提供的 @Res 装饰器后就不能直接 return 数据了,必须操作 res.json/send 去返回数据,然后这又导致拦截器不能正常工作

    你说副作用具体是什么,还是说是指函数式编程中的那种副作用啊

  • 資深大佬 : zy445566

    @rikka 嗯,我以为你说的是函数式编程的副作用

  • 資深大佬 : gxm44

    @zengming00 赞同

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具