MEAN:无法更新数据到DB

MEAN:无法更新数据到DB

问题描述:

我试着去更新数据通过快递到MongoDB的,虽然我的API响应状态200,林无法更新到猫鼬,进出口使用猫鼬皮值MEAN:无法更新数据到DB

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" 
    } 
} 

我必须让整个API被认为是和一直推到MongoDB的

也请不要提出任何替代方案,推动整个JSON到MongoDB中有一个for循环..

任何帮助非常感谢预先

由于

db.dashboard.update

是异步(又称为非阻塞)函数,它将callback作为参数。

要调用db.dashboard.update多次(通过for环)callback您拒绝或解决相同promise内。

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

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

的解决方案:

循环的最后一次迭代中把你的异步代码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; 
} 

使用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(); 
    } 
} 
+0

感谢您的回复......我没有尝试这两个逻辑,但没有成功..still那里mongo没有更新更新值...! – Coeus

+0

您能否显示您从'db.dashboard.update'命令获得的输出/结果? –

+0

当我控制台db.dashboard.update获得的结果是这样的[功能] – Coeus