2016-01-22 87 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 –