请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

请教下如何在 非controller 中获取req对象

问题背景

我使用nest的目的主要是想做 后端服务接口的二次封装,封装返回成前端想要的数据接口,相当于 BFF 层(Backend For Frontend)。
后端服务接口需要一些参数,比如token,渠道来源等等一些参数,会从request和session中获取,再传给后端接口。

php中 可以在任意文件/函数中使用 $REQUEST $_SESSION 来获取请求对像和session对象。 这样就不用一层一层传递参数了。

我的场景是:可能经常有token或者一些其他一些参数,会放在request或者session、cookie上,在需要用到地方可能需要直接拿到。调用获取这些参数的方法可能跟入口controller之间夹了好几层了。如:controller->service1->service2->service3(或某个处理函数)。

如果通过传递参数的方法,感觉不太现实,很难用。

请问下老师,nest中是否有什么好的处理方法?,希望老师给点指导思路,谢谢。

我做过的处理

我试过在service中使用 @Injectable({ scope: Scope.REQUEST }), 的确能够获取到request和session、cookie,但是看描述好像又非常不推荐使用。
搞不明白哪些场景下具体会有哪些问题。

麻烦老师指点下,实际生产的项目中,我们应该怎么处理呢? 谢谢。

正在回答 回答被采纳积分+3

1回答

Brian 2023-01-23 19:26:27

首先,说一下解决方案:

1. 参考 ctx.user,写一个中间件、拦截器(装饰器)来处理你的逻辑(从AOP的编程思想入手);

2. 实在需要使用session中的数据的时候,看看能不能放在一个service中处理所有的逻辑,把与sessioin相关的全放在一个模块中,进行依赖注入,这样需要用的时候,在service层都有对应的逻辑,不需要重复的编写。


php中 可以在任意文件/函数中使用 $REQUEST $_SESSION 来获取请求对像和session对象

——有没有想过把session相关的处理逻辑放在一个单独的module中去,在这个module的service层做所有的逻辑上事情。这个是Nestjs的思考方式~


我试过在service中使用 @Injectable({ scope: Scope.REQUEST }), 的确能够获取到request和session、cookie,但是看描述好像又非常不推荐使用。

——是的,Scope.REQUEST的意思是,在当前的Controller或者Service里面有用,只有repository是单例的。所以,service与controller这两个就不是,请求一次创建一个实例(副作用)

https://img1.sycdn.imooc.com//szimg/63ce6e7b0975fa8325820392.jpg

带来巨大的性能消耗(主要是请求多了,实例也多,吃内存)

0 回复 有任何疑惑可以回复我~
  • 提问者 tulies #1
    感谢老师的解答,其实我还有有很多疑惑 哈哈哈 等我再深入熟悉nestjs再请教。
    回复 有任何疑惑可以回复我~ 2023-01-23 20:31:37
  • Brian 回复 提问者 tulies #2
    好的,加油哦~~~,后面应该会有一个更全面的课程出来 ~~~
    回复 有任何疑惑可以回复我~ 2023-02-05 23:58:23
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信