请教下如何在 非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这两个就不是,请求一次创建一个实例(副作用)

//img.mukewang.com/szimg/63ce6e7b0975fa8325820392.jpg

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

0
2
Brian
回复
tulies
好的,加油哦~~~,后面应该会有一个更全面的课程出来 ~~~
2023-02-05
共2条回复

NestJS 入门到实战 前端必学服务端新趋势

近几年快速发展的Node.js框架,掌握未来前端工程师后端开发能力

582 学习 · 242 问题

查看课程