我有一个使用Express 4的NodeJS API。我使用sequelize连接到数据库,我多次调用一个查询。我想将结果累积到一个数组中。问题是res.send
不会等待循环结束以发送答案。
我的代码
router.post('/payrollReport/', function(req, res, next) {
var usersRecord = [];
models.user.findAll(
).then(function(users) {
for (var i = 0; i < users.length; i++) {
models.sequelize.query('SELECT forms.name, COUNT(form_submits.form_id) ' +
'FROM form_submits ' +
'LEFT JOIN forms ON forms.form_id = form_submits.form_id ' +
'WHERE form_submits.user_id = ' + users[i].user_id +
'AND date("form_submits"."createdAt") >=' + req.body.begin +
'AND date("form_submits"."createdAt") <=' + req.body.end +
" GROUP BY forms.name")
.then(function(results){
usersRecord.push(results[0]);
console.log(usersRecord);
});
};
}).catch(function(error) {
res.status(500).send(error);
});
res.send(usersRecord);
});
感谢您的帮助
修改
使用forEach
添加正确的代码router.post('/payrollReport/', function(req, res, next) {
var usersRecord = [];
models.user.findAll(
).then(function(users) {
async.forEachOf(users, function iterator(user, index, callback) {
models.sequelize.query('SELECT forms.name, COUNT(form_submits.form_id) ' +
'FROM form_submits ' +
'LEFT JOIN forms ON forms.form_id = form_submits.form_id ' +
'WHERE form_submits.user_id = ' + user.user_id +
'AND date("form_submits"."createdAt") >=' + req.body.begin +
'AND date("form_submits"."createdAt") <=' + req.body.end +
" GROUP BY forms.name")
.then(function(results){
results[0].unshift(user);
usersRecord.push(results[0]);
callback();
});
}, function (err) {
if (err) console.error(err.message);
res.send(usersRecord);
});
}).catch(function(error) {
res.status(500).send(error);
});
});
答案 0 :(得分:5)
由于node.js异步工作,因此在完成所有迭代之前执行res.send(usersRecord);
命令。您可以使用async.foreach进行此操作,它将允许您在完成所有迭代后仅运行发送。
有一个很棒的教程here