2014-07-17 49 views
1

我無法從上傳[]對象中刪除項目。
下面代表一個用戶,keys []代表文件上傳關聯的關鍵字,上傳[]是該關鍵字下的文件。這些都是嵌入用戶模型中的文件。我意識到現在我會更好地使用引用,但我現在堅持這一點。下面是我使用的,現在找到上傳項目的功能,刪除項目mongodb和節點異步

______________THIS是我目前FUNCTION_____________________

我會說實話我使用異步和我完全不明白它做好。是否有不同的異步函數或用mongo查找這些項目的方法會更好? 當前問題:1)即使找到正確的項目,它仍會循環直到結束。 2)如何刪除上傳項目?

exports.getApiDelete = function (req, res, next) { 
    User.findById(req.user.id, function(err, user) { 
    if (err) return next(err); 
    console.log("User ID found: "+ user._id); 
    //loop though user keys 
    async.forEach(user.profile.keys, function(item, callback) { 
    //verify key exists 
     if(item.key==req.params.scriptkey){console.log("KEY FOUND")}; 
     async.forEach(item.uploads, function(item, callback) { 
     //verify file exits 
     console.log(req.params.file_id); 
     if(item._id == req.params.file_id){ 

     // DELETE FUNCTION HERE? 

     }; 
     }, function(err){ 
     console.log('Error during async lookup: '+err); 
     }); 

    }, function(err){ 
    console.log('Error during async lookup: '+err); 
    }); 
    }); 
}; 

______________________________THIS我的用戶MODEL_____________________

{ 
"__v": 19, 
"_id": { 
    "$oid": "53c812c4e75ab0b013f3c6bc" 
}, 
"email": "[email protected]", 
"password": "fake", 
"profile": { 
    "gender": "", 
    "keys": [ 
     { 
      "_id": { 
       "$oid": "53c8130ae75ab0b013f3c6bd" 
      }, 
      "status": false, 
      "iteration": 0, 
      "created": { 
       "$date": "2014-07-17T18:16:42.568Z" 
      }, 
      "uploads": [], 
      "description": "This is being run from my Windows Desktop.", 
      "location": "Front Row", 
      "name": "fake_Desktop", 
      "key": "80f94c80-0dde-11e4-ae14-43922f7b8f23" 
     }, 
     { 
      "_id": { 
       "$oid": "53c814ade75ab0b013f3c6be" 
      }, 
      "created": { 
       "$date": "2014-07-17T18:23:41.777Z" 
      }, 
      "description": "Windows VM test.", 
      "iteration": 12, 
      "key": "7ad78410-0ddf-11e4-ae14-43922f7b8f23", 
      "location": "Back Right", 
      "name": "fake2_Desktop", 
      "status": false, 
      "uploads": [ 
       { 
        "_id": { 
         "$oid": "53c81517e75ab0b013f3c6bf" 
        }, 
        "ip": "10.0.1.156", 
        "fname": "hklm_1.txt", 
        "iteration": 1, 
        "created": { 
         "$date": "2014-07-17T18:25:27.241Z" 
        }, 
        "filepath": "script_uploads/7ad78410-0ddf-11e4-ae14-43922f7b8f23_1_hklm_1.txt" 
       }, 
       { 
        "_id": { 
         "$oid": "53c8151ae75ab0b013f3c6c0" 
        }, 
        "ip": "10.0.1.156", 
        "fname": "hklm_1.txt", 
        "iteration": 2, 
        "created": { 
         "$date": "2014-07-17T18:25:30.634Z" 
        }, 
        "filepath": "script_uploads/7ad78410-0ddf-11e4-ae14-43922f7b8f23_2_hklm_1.txt" 
       } 
      ] 
     } 
} 

回答

0

你只想從數組中刪除?如果是,請使用

for(var i =0, j = item.uploads.length; i < j; i++) { 
    //verify file exits 
    console.log(req.params.file_id); 
    if(item.uploads[i]._id == req.params.file_id){ 

     item.uploads.slice(i, 1); 

    }; 

並在最後使用:user.save(function(err){}); 如果有什麼你想從文件系統刪除,使用:

fs = require('fs'); 
fs.unlink(FILE PATH , function(err) { 
    console.log(err); 
}); 

而且你並不真正需要的foreach異步版本,導致User.findById是異步的本身和整個過程背後的背景。

即使在發現 正確的項目後,它仍會循環直到結束。

async.forEach沒有「break」。所以如果你不想做不需要的過程,就像我一樣使用,並追加一個斷點。

0

你的循環內沒有異步調用,所以你不需要async.forEach()。使用JavaScript本地循環將會很好:

exports.getApiDelete = function (req, res, next) { 
    User.findById(req.user.id, function(err, user) { 
    if (err) return next(err); 
    console.log("User ID found: "+ user._id); 
    user.profile.keys.forEach(function(el) { 
     if(el.key==req.params.scriptkey){console.log("KEY FOUND");} 
     el.uplaods.forEach(function(item) { 
      console.log(req.params.file_id); 
      if(item._id == req.params.file_id){ 

       // DELETE FUNCTION HERE? 

      } 
     }); 
    }); 
    }); 
};