我有一个使用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); }); });
Nir Levy.. 5
由于node.js异步工作,res.send(usersRecord);
因此在完成所有迭代之前执行命令.您可以使用async.foreach,它将允许您在所有迭代完成后运行您的发送.
有一个关于它的伟大的教程在这里
由于node.js异步工作,res.send(usersRecord);
因此在完成所有迭代之前执行命令.您可以使用async.foreach,它将允许您在所有迭代完成后运行您的发送.
有一个关于它的伟大的教程在这里