我一直致力于为express和node中的rest api创建更好的架构。让我们说我的路由中间件中有3种方法 -
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到另一个路由(也有这种方法可以修改req.session)可以修改req.session.result和MailerService.sendSubscriptionMail没有获取数据它需要发送给用户还是该req对象与内存中的那个完全不同?
(b)是否有其他方法在中间件之间传输数据而不是设置req对象?
答案 0 :(得分:1)
是否有新的http请求到另一条路线(也是 有这些方法可以修改req.session)可以修改 req.session.result和MailerService.sendSubscriptionMail没有得到 需要发送给用户的数据或该req对象 在记忆中会与这个完全不同吗?
req
对象特定于此请求。另一个请求无法更改该对象。但是,如果req.session
中的会话是来自该特定用户的所有请求共享的公共共享sesison对象,则req.session.result
可能会被来自该用户的另一个请求更改,该请求将在大约同一时间处理(例如,在各种异步操作中交错)。
如果您想确保该用户的其他任何请求都无法更改您的结果,请将其置于req.result
,而不是req.session.result
,因为其他任何请求都无法访问req.result
是否有其他方法可以在中间件之间传输数据 而不是设置req对象?
req
或res
个对象是在中间件处理程序之间共享信息的正确位置,因为它们对于此特定请求是唯一的。请注意session
对象,因为它在来自同一用户的多个请求之间共享。
在三个处理程序之间共享数据的另一种可能方法是创建一个中间件处理程序,该处理程序调用所有三个中间件处理程序,然后在该单个函数中共享数据(例如,将其传递给其他处理程序)。 p>
例如,您可以更改后两种方法的调用签名,以便从setUser()
中获取数据,然后直接将其传递到sendSubscriptionMail()
,而无需使用req
或session
个对象来存储它。
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);
}]);
});