node.js - 每当一个回调发生错误,然后在nodejs中未执行以下嵌套的回调时,该怎么办?

标签 node.js error-handling async-await callback

在使用嵌套的callbackspromisesasync/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/

相关文章:

javascript - 等待函数回调时出现问题

c# - 运行异步 Foreach 循环 C# async await

javascript - 使用对象键作为变量来替换文件中的文本

api - 在IBM Cloudant NoSQL DB上获取错误 “Payment Required”

excel - VBA粘贴并在错误显示msgbox上

php - 为什么此错误处理函数会导致domdocument()挂起?

c# - 带有回调的 .NET 异步 Web 服务调用

node.js - visual studio 代码 - Node js 错误与 typescript 调试配置

node.js - 路由是在 AngularJS 中通过 HTML 提供 JS 文件

javascript - RethinkDB:​​条件更新插入(仅当特定字段匹配时)?