2016-01-22 86 views
0

我總是在一個路由或端點中有多個操作。舉一個例子,當用戶刪除一個項目時,我想在s3中刪除相關文件,除了從數據庫中刪除相關的收集。nodejs函數中的異步混亂

那麼下面的代碼好嗎?如果我在DeleteItem函數中放置第一個函數(從s3中刪除文件),這有什麼關係嗎?

router.post('/item/delete', function(req, res) { 

    if(req.body.dlt_item){ 

     var tempArray = []; 
     tempArray.push({"Key":req.body.dlt_item}); 

     s3Bucket.deleteObjects({ 
       Bucket: 'myS3', 
       Delete: { 
        Objects: req.body.dlt_item 
       } 
      }, function(err, data) { 
       if (err) 
       return console.log(err); 
     }); 
     } 

    Item.DeleteItem(req.body.item_id, function(err,result){ 
    if(err){console.log(err)} 
    res.send({result:1}); 
    }) 
}); 

回答

0

你應該像這樣組織你的代碼。這將確保s3刪除僅在mongodb刪除完成時纔會啓動。 在你的代碼中,兩件事情都是同時發生的。這在某些情況下可能會導致問題。 如果其中一個失敗而其他成功則會有麻煩。
假設s3文件被成功刪除,並且mongo刪除失敗。那麼你會有很多對現有資源的引用。

router.post('/item/delete', function(req, res) { 

if(req.body.dlt_item){ 
    var tempArray = []; 
    tempArray.push({"Key":req.body.dlt_item}); 
Item.DeleteItem(req.body.item_id, function(err,result){ 
    if(err) 
    { 
    console.log(err) 
    res.send(err); 
    } 
    else 
    { 
      //deletion from mongodb is succesful now delete from s3 
      s3Bucket.deleteObjects({ 
      Bucket: 'myS3', 
      Delete: { 
       Objects: req.body.dlt_item 
      } 
     },function(err, data) { 
      if (err) 
      { 
      // deletion from s3 failed you should handle this case 
      res.send({result:1}); 
      return console.log(err); 
      } 
      else 
      { 
       // successful deletion from both s3 and mongo. 
       // If you do not want to wait for this then send the response before this function. 
       res.send({result:1}); 
      } 
     }); 
    }  
    }) 
}); 
+0

同時會導致問題,這就是我想知道的。你能詳細說明嗎? –

+0

如果其中一個失敗而其他成功則會出現問題。假設s3文件被成功刪除,並且mongo刪除失敗。那麼你會有很多對現有資源的引用。 @ NicholeA.Miler –