nodejs函数中的异步混淆

时间:2016-01-22 13:33:12

标签: javascript node.js mongodb express

我总是在一个路由或端点中有多个操作。举一个例子,当用户删除一个项目时,除了从数据库中删除相关的集合之外,我还希望在s3中删除相关文件。

以下代码是否正常?如果我将第一个函数(从s3中删除文件)放在DeleteItem函数中,这有关系吗?

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});
  })
});

1 个答案:

答案 0 :(得分:0)

您应该像这样组织代码。这将确保仅在mongodb删除完成时才开始删除s3。 在你的代码中,这两件事同时发生。这可能会在某些情况下引起问题。 如果一个失败而另一个失败则会出现问题。
假设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});
             }
        });
   }      
  })
});