javascript - 平均 : unable to update data to DB

标签 javascript mongodb express

我尝试通过express将数据更新到mongodb,虽然我的api响应状态200,但我无法将值更新到mongoose,我使用mongoose皮肤

var mongo = require('mongoskin');
var db = mongo.db(config.connectionString, {
    native_parser: true
});
var ObjectId = require('mongodb').ObjectID;
db.bind('users');
db.bind('dashboard')

function update(_id, userParam) {
    var deferred = Q.defer();

    for (var i = 0; i < Object.keys(userParam).length; i++) {
        var set = {

            file: userParam[i].file,
            result: userParam[i].result,
            user_id: userParam[i].user_id

        };
        db.dashboard.update({
                _id: mongo.helper.toObjectID(_id)
            }, {
                $set: set
            },
            function(err, doc) {
                if (err) deferred.reject(err);
                deferred.resolve();
            });
    };
    return deferred.promise;
}

我的API

{
    "0": {
        "_id": "57396e49a6c36801024021a1",
        "file": "app_static/audio/SampleAudio_0.4mb.mp3",
        "result": "FM",
        "user_id": "57396ded0aef5ee405320dbe"
    },
    "1": {
        "_id": "57396e5ca6c36801024021a2",
        "file": "app_static/audio/SampleAudio_0.7mb.mp3",
        "user_id": "57396ded0aef5ee405320dbe"
    }
}

我有一个 for 循环,以便考虑整个 api 并将其推送到 mongodb

还请建议任何替代方案将整个 json 推送到 mongodb..

非常感谢任何帮助

提前致谢

最佳答案

db.dashboard.update 是一个异步(也称为非阻塞)函数,它采用callback 作为参数。

您多次调用db.dashboard.update(通过for循环)但是回调内> 您正在拒绝或解决相同 promise

这意味着,返回的 promisethen 方法将在第一个 db.dashboard.update 回调时执行被调用。

对于其余的更新操作,您的 then 函数将不会收到通知。

解决方案:

1

将异步代码放入 IIFE 中并在循环的最后一次迭代期间调用 deferred.resolve

function update(_id, userParam) {

    var deferred = Q.defer();

    var length = Object.keys(userParam).length;

    for (var i = 0; i < length; i++) {
        var set = {

            file: userParam[i].file,
            result: userParam[i].result,
            user_id: userParam[i].user_id

        };

        (function(set, i) { // <------------------------- enclosing everything in an IIFE

            db.dashboard.update({
                    _id: mongo.helper.toObjectID(_id)
                }, {
                    $set: set
                },
                function(err, doc) {
                    if (err) {
                        deferred.reject(err);
                    } else if (length - 1 === i) { // <-- checking if this is the last iteration
                        deferred.resolve();
                    }
                });

        })(set, i); // <--------------------------------- sharing set and i with the IIFE scope
    };

    return deferred.promise;
}

2

使用async.map 。 (这是更优雅的方式)。

function update(_id, userParam) {

    var deferred = Q.defer();

    /**
     * Array to contain all the 
     * @type {Array}
     */
    var arrayOfSets = [];

    /**
     * Converting each key-value pair in userParam into an array element
     * and pushing it into arrayOfSets
     */
    for (var i in userParam) {

        arrayOfSets.push({

            file: userParam[i].file,
            result: userParam[i].result,
            user_id: userParam[i].user_id

        });
    }

    /**
     * Executing async.map
     *
     * Parameters:
     * 
     * 1. arrayOfSets - each element will be fed to the function in the 2nd parameter
     *
     * 2. function(item, callback) - in this function do the update operation
     *
     * 3. function(err, result) - in this function resolve or reject the promise
     */
    async.map(arrayOfSets, function(item, callback) {

        db.dashboard.update({
                _id: mongo.helper.toObjectID(_id)
            }, {
                $set: item
            },
            function(err, doc) {
                if (err) {
                    callback(err, null);
                } else {
                    callback(null, doc);
                }
            });

    }, function(err, result) {

        if (err) {
            deferred.reject(err);
        } else {
            deferred.resolve(result);
        }

    });

    return deferred.promise;

}
<小时/>

此外,else 代码应始终包含在 else 中!

function(err, doc) {
    if (err) {
        deferred.reject(err);
    } else { // always enclose in else!
        deferred.resolve();
    }
}

关于javascript - 平均 : unable to update data to DB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37289007/

相关文章:

node.js - 在 node/express 中启用了 CORS 但得到 "Response to preflight request doesn' t 通过访问控制检查”

javascript - Array.sort 的这个中间阶段发生了什么?

javascript - 如何跟踪react-admin dataProvider中的错误

mongodb - 如何在 MongoDB 上查询字典

node.js - Mongoose 用新旧之和更新变量

c# - 在 Mongodb 中将 JObject 存储为 C# 类的属性

javascript - 如何在React js文本区域内渲染漂亮的json数据?

javascript - 如何更新主干 View 的部分内容?

http - 使用 express.js 进行路由 - 无法获取错误

javascript - 全局声明时导出的函数不可用