请教下如何在 非controller 中获取req对象
来源:11-4 nestjs鉴权库:JWT核心文档解析

tulies
2023-01-21
问题背景
我使用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,但是看描述好像又非常不推荐使用。
搞不明白哪些场景下具体会有哪些问题。
麻烦老师指点下,实际生产的项目中,我们应该怎么处理呢? 谢谢。
1回答
-
Brian
2023-01-23
首先,说一下解决方案:
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这两个就不是,请求一次创建一个实例(副作用)
带来巨大的性能消耗(主要是请求多了,实例也多,吃内存)
022023-02-05
相似问题