我正在尝试更好地理解Node / Express,并且想知道一个请求是否有可能覆盖另一个请求的内存。这是一个人为的例子:
// UserController.js
const userService = require('./UserService');
class UserController {
async show(req, res) {
userService.userId = req.params.userId;
const userDetails = await userService.getDetails();
}
}
module.exports = UserController;
// UserService.js
const request = require('request-promise');
class UserService {
set userId(userId) {
this._userId = userId;
}
async getDetails() {
// Make HTTP request to some service
let options = {
method: 'GET',
url: 'https://url-to-user-service/' + this._userId, // Notice use of userId
json: true,
headers:{}
};
return request(options);
}
}
const userService = new UserService(); // pseudo-singleton
module.exports = userService;
是否有可能有2个并发请求执行以下操作:
Request1:执行行“userService.userId = req.params.userId”// userId 1
Request2:执行行“userService.userId = req.params.userId”// userId 2
Request1:执行行“const userDetails = await userService.getDetails();” userId为2?或者,在请求2执行之前,是否会对请求1执行整个show()函数?
谢谢!
答案 0 :(得分:1)
实际上,你的代码很麻烦,当有多个请求快速发送时它会咬你。
下面:
async show(req, res) {
userService.userId = req.params.userId;
const userDetails = await userService.getDetails();
}
当节点等待userService.getDetails()
的结果时,是的,您可以使用show
函数的另一个并行执行,全部或部分执行。
此功能可让您的程序更高效,尤其是当userService.getDetails
追加速度缓慢时。当然,如果您从函数中访问某些共享数据,那么您需要考虑可能发生的不一致。
我无法在不知道更多的情况下重新设计您的程序,但简单的解决方案可能是将UserService
的实例或具有相同角色的对象保留在show
的范围内。