在NodeJS和Express应用程序中共享内存

时间:2018-06-14 06:14:27

标签: node.js express

我正在尝试更好地理解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()函数?

谢谢!

1 个答案:

答案 0 :(得分:1)

实际上,你的代码很麻烦,当有多个请求快速发送时它会咬你。

下面:

  async show(req, res)  {
    userService.userId = req.params.userId;
    const userDetails = await userService.getDetails();
  }

当节点等待userService.getDetails()的结果时,是的,您可以使用show函数的另一个并行执行,全部或部分执行。

此功能可让您的程序更高效,尤其是当userService.getDetails追加速度缓慢时。当然,如果您从函数中访问某些共享数据,那么您需要考虑可能发生的不一致。

我无法在不知道更多的情况下重新设计您的程序,但简单的解决方案可能是将UserService的实例或具有相同角色的对象保留在show的范围内。