我想使用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警告,我可以使它工作。
答案 0 :(得分:3)
这里要理解的主要是,在函数创建过程中不包含变量,而不是在调用函数期间。
在您的情况下,当创建函数check
时,它不会包含res
或req
。所以,即使你从其他函数调用它,它也不会意识到它们。
要解决此问题,您只需在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);
}
});