Express.js - foreach数据数组并将它们存储在数据库中

时间:2015-03-04 18:52:21

标签: javascript node.js promise bluebird bookshelf.js

我正在使用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'});   
});

我的理解是,这些调用是异步的,并且始终对最后的数据进行操作,因为句子比保存更快。我在做什么吗?

这个问题有哪些最好,最简单,最正确的解决方案?

2 个答案:

答案 0 :(得分:3)

您的代码中不清楚您是想要并行还是按顺序运行查询。

我假设是并行的,但你可以用.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});
    });
});

没有必要只记录错误才能记录它,所以我删除了它。只有在你能够处理它时才会发现错误。

答案 1 :(得分:0)

基本上,'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);
    });
}