Nodejs闭包和res对象在回调函数中

时间:2015-10-16 18:11:55

标签: javascript json node.js mongodb closures

我想使用mongoose将json文件(包含json对象数组)中的一些数据导入到mongodb中。当路径'/ import'被调用时,我通过“require”加载文件并开始迭代。

router.get('/import', function (req, res) {
  var data = require('../import/1.json');
  nTotal = data.length;
  for (var i = 0; i < nAppCount; i++) {
    var obj = new MyObject(data[i]);
    obj.save(check);
  }
});

由于JSHint警告我不要“在循环中创建函数”,我创建了一个名为 check 的函数,如下所示:

function check (err,doc){
  nProcessed++;
  if (err) {
    logger.log('error', err.message, err.errors);
  } else {
    logger.log('debug', "%d of %d processed",nProcessed, nTotal);
    if (nProcessed===nTotal) {
      res.render('index');
    }
  }
}

一切都按预期工作直到结束,但是当处理完所有对象后,我得到:

  

ReferenceError:res未定义

是不是“检查”应该“知道” res 变量是一个闭包函数?我怎么去访问“res”?

注意:如果我忽略jsHint警告,我可以使它工作。

1 个答案:

答案 0 :(得分:3)

这里要理解的主要是,在函数创建过程中不包含变量,而不是在调用函数期间。

在您的情况下,当创建函数check时,它不会包含resreq。所以,即使你从其他函数调用它,它也不会意识到它们。

要解决此问题,您只需在check内和router.get循环之前定义for函数即可。例如,

router.get('/import', function (req, res) {
  ...

  function check(err, doc) {
    ...
  }

  for (var i = 0; i < nAppCount; i++) {
    (new MyObject(data[i])).save(check);
  }

});