[英]Express.js - foreach array of data and store them in the database
我正在使用expressjs,bookshelf.js,我想發布數據數據,預測這些數據並保存。
我不確定問題出在哪里(快遞,書架或只是簡單的舊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'});
});
我的理解是,這些調用是異步的,並且始終對最后的數據進行操作,因為句子比保存更快。 我在做什么嗎?
這個問題有哪些最好,最簡單,最正確的解決方案?
從您的代碼中不清楚您是希望查詢是並行還是順序運行。
我假設是並行的,但你可以用.each替換.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});
});
});
沒有必要只記錄錯誤來記錄它,所以我刪除它。 只有在你可以處理時才會收到錯誤。
本質上,'then'函數將異步執行,並且循環將繼續獨立執行,如您所懷疑的那樣。
我相信一個解決方案是定義一個函數,它基本上將參數d
作為參考,並用它執行異步。 所以這應該工作:
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);
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.