gpt4 book ai didi

node.js - express js - 一个 http 请求与其他请求有何不同?

转载 作者:可可西里 更新时间:2023-11-01 16:36:54 26 4
gpt4 key购买 nike

我一直致力于为 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 中的数据向该用户发送邮件。

用户服务-

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

module.exports = exports;

用户 Controller -

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

module.exports = exports;

邮件服务 -

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 没有得到数据它需要将哪个发送给用户,或者该请求对象是否会与内存中的这个完全不同?

(b)除了设置req对象之外,还有其他方法可以在中间件之间传输数据吗?

最佳答案

Is there any chance that a new http req to another route (which also has these kind of methods which can modify req.session) can modify the req.session.result and MailerService.sendSubscriptionMail does not get the data which it needs to send to the user or will that req object will be completely different from this one in the memory?

req 对象特定于此请求。该对象不能被另一个请求更改。但是,如果 req.session 中的 session 是来自该特定用户的所有请求共享的公共(public)共享 sesison 对象,则 req.session.result 可能会被另一个请求更改来自大约在同一时间得到处理的用户(例如,在各种异步操作中交错)。

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

Is there any other method to transfer data between middleware rather than setting up req object?

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);
}]);
});

关于node.js - express js - 一个 http 请求与其他请求有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35354014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com