在使用嵌套的callbacks
或promises
或async/await
时,首先执行一组处于await
条件的任务,然后在成功时才继续执行;我想知道如果在任何中间任务之间出现错误怎么办?
从那以后,由于将立即停止的操作,因此将不执行任何任务。
但是由于这个原因,当调用此终点时,整个过程变得不完整,因为一些初始任务被执行并停在中间,其余任务也被暂停/停止。
因此,整个情况变得不完整和简陋。
怎么处理呢?
下面是我在使用嵌套回调的项目中处理多个路由的代码示例。当一个任务出错时,由于发生了错误,下面的整个过程都停止了。
router.route('/addTasks-approve').get(function(req, res) {
User.updateMany({'Addtasks.commonID':req.query.id},
{$set: {"Addtasks.$.width" :'250px',
"Addtasks.$.height" :'32px',
"Addtasks.$.background" :'linear-gradient(45deg, #0f3443, #34e89e)',
"Addtasks.$.border_radius" :'10px / 5px',
"Addtasks.$.status" :req.query.text}},
function (error, success) {
if (!error) {
console.log("Approved color set!");
User.findOne({tag:'Admin','Addtasks.commonID':req.query.id},function (error, dataAdmin) {
if (error) {
console.log("error = "+ error);
res.end('{"msg" : "Some error occurred", "status" : 700}');
}
else {
dataAdmin.Addtasks.forEach(element => {
if(element.commonID == req.query.id)
{
User.findOneAndUpdate({tag:'Client','Addtasks.commonID':req.query.id},
{$push: {'Addtasks.$.Bigpaths4Clients':{$each : element.Bigpaths4Clients}},
$set: {"Addtasks.$.background" :'linear-gradient(45deg, #1E6305, #BDFF00)',
"Addtasks.$.status" :'Done'}},
function (error, data) {
if (error) {
console.log("error = "+ error);
res.end('{"msg" : "Unable to add the Task", "status" : 700}');
}
else {
console.log("Addtasks added to Client's dashboard succesfully");
sendMails2Client(data.email, element.topic, 'In Progress', 'Done');
sendMails2User(dataAdmin.email, element.topic, 'Done', 'Approved');
User.findOne({tag:'Admin','Addtasks.commonID':req.query.id},function (error, dataWriter) {
if (error) {
console.log("error = "+ error);
res.end('{"msg" : "Some error occurred", "status" : 700}');
}
else {
sendMails2User(dataWriter.email, element.topic, 'Done', 'Approved');
res.end('{"success" : "success", "status" : 200}');
}
})
}
})
}
});
}
});
}
else {
res.end('{"msg" : "Unable to set the status and color for Approved", "status" : 700}');
}
});
});
最佳答案
对于这种情况,我更喜欢在mongoose中使用Transactions
,在MongoDB 4.0和Mongoose 5.2.0中事务是新的。事务使您可以隔离执行多个操作,如果其中一个操作失败,则可能撤消所有操作。本指南将帮助您开始使用Mongoose进行交易,检查documentation,因为如果您进行了多次更新,则在任务中间发生错误时,必须完成rollback
:这是帮助您的示例
try {
const sess = await mongoose.startSession();
sess.startTransaction();
await User.deleteMany({'xyz': 999}).session(sess);
await createdUser.save({ session: sess });
await user.save({ session: sess });
await sess.commitTransaction();
} catch (err) {
console.log(err)
);
关于node.js - 每当一个回调发生错误,然后在nodejs中未执行以下嵌套的回调时,该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65775529/