expressionJS – 一个HTTP请求如何不同于其他?

我一直在为express和node创build一个更好的rest结构的体系结构。 假设我的路由中间件有三种方法 –

router.post('/users/:id', [ UserService.getUserById, UserController.setUser, MailerService.sendSubscriptionMail ]); 

我在调用UserService.getUserById中设置req.session.user,然后使用它在UserController.setUser中设置req.session.result。 现在我正在使用存储在req.session.result中的数据发送邮件给这个用户。

UserService –

 exports.getUserById = function(req, res, next) { . . req.session.user = data; . . }; module.exports = exports; 

UserController –

 exports.setUser = function(req, res, next) { . . req.session.result = req.session.user; . . }; module.exports = exports; 

MailerService –

 exports.sendSubscriptionMail = function(req, res, next) { // Using req.session.result here to send email }; module.exports = exports; 

现在我有两个关于上述过程的问题 –

(a)是否有任何新的http请求到另一个路由(它也有这种方法可以修改req.session)可以修改req.session.result,并且MailerService.sendSubscriptionMail不会获得它需要的数据发送给用户还是将那个req对象与内存中的这个完全不同?

(b)有没有其他方法可以在中间件之间传输数据而不是设置req对象?

有没有任何机会,一个新的HTTP请求到另一个路由(也有这种方法,可以修改req.session)可以修改req.session.result和MailerService.sendSubscriptionMail不会得到它需要发送的数据用户还是将那个req对象与这个内存中的完全不同?

req对象是特定于此请求的。 该对象不能被另一个请求改变。 但是,如果req.session的会话是共享sesison对象,并且来自该特定用户的所有请求共享,则req.session.result可能会被来自该用户的另一个请求在同一时间处理(例如,在各种asynchronous操作中交错)。

如果你想确保这个用户没有其他的请求可以改变你的结果,那么把它放在req.result ,而不是req.session.result因为没有其他请求可以访问req.result

有没有其他的方法来在中间件之间传输数据而不是设置req对象?

reqres对象是中间件处理程序之间共享信息的正确位置,因为它们对于此特定请求是唯一的。 session对象要小心,因为它是由来自同一用户的多个请求共享的。


在三个处理程序之间共享数据的另一种可能的方法是使一个中间件处理程序调用所有三个中间件处理程序,然后在该单个函数内共享数据(例如将其传递给其他处理程序)。

例如,您可以更改第二个方法的调用签名,以便您可以从setUser()获取数据,然后直接将其传递给sendSubscriptionMail()而无需使用reqsession对象进行存储。

 router.post('/users/:id', [UserService.getUserById, function(req, res, next) { UserController.setUser(req, res, function(err, result) { if (err) return next(err); MailerService.sendSubscriptionMail(result, req, res, next); }]); });