如何在Node.js上正确处理并发问题?

时间:2018-04-03 12:53:19

标签: node.js express asynchronous

情景&建议的代码

有多个端点共享相似的逻辑(即执行常见任务)。

let express = require('express');
let router = express.Router();
router.post('/test1', function(req, res) {
   asyncFunction(something1, function(result) {
      var userId = result;
      ... some task
   });
};
router.post('/test2', function(req, res) { 
  asyncFunction(something1, function(result) {
      var userId = result;
      ... some task
   });
};
router.post('/test3', function(req, res) { 
   asyncFunction(something1, function(result) {
      var userId = result;
      ... some task
   });
}

由于不同的端点需要执行类似的任务(包括异步调用),我认为可以在全局范围内创建一个函数,并回调结果并在最后响应。 所以,就是这样:

let express = require('express');
let router = express.Router();
router.post('/test1', function(req, res) {
   asyncFunction(something1, function(result) {
      var userId = result;
      test123Function(userId, something, function(rst) {...})
   });
};
router.post('/test2', function(req, res) { 
  asyncFunction(something2, function(result) {
      var userId = result;
      test123Function(userId, something, function(rst) {...})
   });
};
router.post('/test3', function(req, res) { 
   asyncFunction(something1, function(result) {
      var userId = result;
      test123Function(userId, something, function(rst) {...})
   });
}
test123Function(userId, parameter, callback) {
   ...
}

问题

但是,我知道在全球空间做一些事情是不好的做法,而且,当我使用上述结构时,我担心并发问题。 (例如,当数百人同时访问test1,或者多人同时访问test1和test2或test3时,响应可能会混淆。)

我知道每个req都是唯一的,因此我可以在req中保存一些变量以避免上述问题,但我无法从全局空间中的函数访问req(具体来说,当我想使用一个函数来处理时)像上面这样的类似任务)。我也听说过会议,但我不确定处理这种情况是否是正确的概念。

0 个答案:

没有答案