簡體   English   中英

Express.js - foreach數據數組並將它們存儲在數據庫中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM