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

标签 javascript node.js promise bluebird bookshelf.js

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

我不确定问题出在哪里( express 、书架或只是普通的旧 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'});   
});

我的理解是,这些调用是异步的,总是对最后的数据进行操作,因为 for sentence 比 save 快。我在做什么吗?

这个问题最好、最简单和最正确的解决方案是什么?

最佳答案

从您的代码中不清楚您是希望查询并行运行还是顺序运行。

我假设是并行的,但您可以将 .map 替换为 .each,它将按顺序运行

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});
    });
});

没有必要只捕获一个错误来记录它,所以我删除了它。仅在可以处理错误时捕获错误。

关于javascript - Express.js - foreach 数据数组并将它们存储在数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28862516/

相关文章:

javascript - 哪里写成功和错误

javascript - 将 bootstrap 模态打印为 PDF

Javascript 倒计时显示 NaN

javascript - 通过 Github 进行身份验证(使用 everyauth)

javascript - 读取 .env 文件并将所有行转换为一个对象

mysql - Node.js 访问 WampServer MySQL 数据库

angular - ExpressJS/Typescript - 无法检索 ZoneAwarePromise 值?

promise - Axios 拦截器 : how to throw errors in the onFulfill?

Javascript - 比较日期的最佳方式

javascript - 了解 node.js 中的异步函数