我尝试通过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
。
这意味着,返回的 promise
的 then
方法将在第一个 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/