【问题标题】:Best way to handle the error in async node处理异步节点中的错误的最佳方法
【发布时间】:2017-11-22 03:57:09
【问题描述】:

为了捕捉错误,我在每个看起来很糟糕的函数中都编写了 if-else 块。请提出一种更好的方法来处理异步节点中的错误

async.waterfall([

            function(callback){

                fnOne.GetOne(req, res,function(err,result) {  

                  if(err){
                    console.error("Controller : fnOne",err);
                    callback(err,null);
                  }
                  else{

                    var fnOne = result; 

                   callback(null, fnOne);
                  }
                })            
            },

            function(fnOne, callback){

               fnTwo.two(fnOne,function(err,result) {
                  if(err) {
                    console.error(err);
                    callback(err,null);
                  }
                  else{

                    callback(null, context);
                  }
               })            
            }
        ], function (err, result) {     

           if(err){
              console.error("Controller waterfall Error" , err);
              res.send("Error in serving request.");
           }
        });

【问题讨论】:

  • 如果你不想一直写if(err) { callback(err) },你可以考虑使用promise。 Promise 允许错误的自动传播。您可以为多个函数添加一个错误处理程序。

标签: javascript node.js asynchronous


【解决方案1】:

您可以将错误传递给异步并在回调中捕获它

async.waterfall([
    function (callback) {
        fnOne.GetOne(req, res, callback); // err and result is passed in callback
    },                                    // as it's "function(err, result)"
    function (fnOne, callback) {          // the same as the arguments for the
        fnTwo.two(fnOne, callback);       // callback function
    }
], function (err, result) {
    if (err) {
        console.error("Error :", err);
        res.send("Error in serving request.");
    }else{
        res.end("A-OK");
    }
});

【讨论】:

    【解决方案2】:

    你做的太多了

    Waterfall 已经有内部错误管理。

    callback(err, [results]) - 一个可选的回调,运行一次 功能已经完成。这将传递最后的结果 任务的回调。

    试试这个

    async.waterfall([
                function(callback){
                    fnOne.GetOne(req,res,  callback)            
                },
                function(fnOne, callback){
                   fnTwo.two(fnOne,callback) {           
                }
            ], function (err, result) {     
               if(err){
                  console.error("Controller waterfall Error" , err);
                  res.send("Error in serving request.");
               }
            });
    

    【讨论】:

      【解决方案3】:
      async.each(files, (file, callback) => {
              // Create a new blob in the bucket and upload the file data.
              const blob = bucket.file(file.file.originalname);
              const blobStream = blob.createWriteStream();
      
              blobStream.on('error', (err) => {
                  callback(err);
              });
      
              blobStream.on('finish', () => {
                  // The public URL can be used to directly access the file via HTTP.
                  Storage.bucket(BUCKET_NAME)
                      .file(blob.name)
                      .move(body.email + '_' + file.dir + '.' + blob.name.split('.').pop())
                      .then((e) => {
                          body[file.dir] = format(`https://storage.googleapis.com/${BUCKET_NAME}/${e[0].name}`)
                          callback();
                      })
                      .catch(err => {
                          console.error('ERROR: ', err);
                      });
              });
      
              blobStream.end(file.file.buffer);
          }, (err) => {
              if (err) {
                  console.error(err);
                  return res.status(422).send({error: true, data: {message: "An error occured. Please fill all fields and try again"}});
              }
      
              // save to db
          });
      

      【讨论】:

      • 请在您的回答中提供一些上下文和评论!
      猜你喜欢
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 2017-09-13
      • 2015-06-12
      • 2019-08-04
      • 2013-10-13
      • 1970-01-01
      相关资源
      最近更新 更多