我总是在一个路由或端点中有多个操作。举一个例子,当用户删除一个项目时,除了从数据库中删除相关的集合之外,我还希望在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});
})
});
答案 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});
}
});
}
})
});