Express.js – foreach数据数组并将其存储在数据库中

我使用expressjs,bookshelf.js,我想发布数据数组,foreach这样的数据,并保存它。

我不是很确定问题在哪里(expression式,书架或简单的旧javascript),但是这里是这样的情况:当我发布所述数组并尝试迭代它时,我得到了正确的数据保存量,但都具有数组中最后一项的值。

代码如下:

router.post('/save/', function(req, res){ var data = req.body; var result = []; for (var i in data) { var d = data[i]; if (d.user_id == -1) d.user_id = null; new Term().where({'date_of_driving': d.day}) .fetch() .then(function(terms){ if (terms != null) { return new Term({'id':terms.id}).save(d).then(function(item_updated){}); } else { return new Term().save(d).then(function(item_saved){}); } }) .catch(function(error){ console.log(error); }); } res.send({'saved': 'ok'}); }); 

我的理解是,这些调用是asynchronous的,总是在最后的数据上运行,因为句子比保存更快。 我上了什么?

什么是这个问题最好,最简单,最正确的解决scheme?

从代码中不清楚是否要查询并行或顺序运行。

我假设并行,但你可以用.eachreplace.map,它将按顺序运行

 router.post('/save/', function(req, res){ Promise.map(req.body, function(d) { if (d.user_id == -1) d.user_id = null; return new Term().where({'date_of_driving': d.day}).fetch().then(function(terms){ if (terms != null) { return new Term({'id':terms.id}).save(d); } else { return new Term().save(d); } }); }).then(function() { res.send({'saved': 'ok'}); }).catch(Promise.OperationalError, function(e) { // Note that stack reveals internal server code so you might // not want to send it over in production res.status(400).send({stack: e.stack, message: e.message}); }); }); 

没有必要只logging一个错误,所以我删除它。 只有在可以处理的时候才会发现错误。

本质上,“then”函数将被asynchronous执行,循环将继续独立执行,正如您所怀疑的那样。

我相信一个解决scheme是定义一个函数,将参数d作为参考,并执行asynchronous的东西。 所以这应该工作:

 router.post('/save/', function(req, res){ var data = req.body; var result = []; for (var i in data) { var d = data[i]; if (d.user_id == -1) d.user_id = null; doTheThing(d); } res.send({'saved': 'ok'}); }); function doTheThing(d) { new Term().where({'date_of_driving': d.day}) .fetch() .then(function(terms){ if (terms != null) { return new Term({'id':terms.id}).save(d).then(function(item_updated){}); } else { return new Term().save(d).then(function(item_saved){}); } }) .catch(function(error){ console.log(error); }); }