2016-05-18 79 views
1

我試着去更新數據通過快遞到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循環..

任何幫助非常感謝預先

由於

回答

1
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