最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Best way to handle the error in async node - Stack Overflow

programmeradmin4浏览0评论

To catch errors I have written if-else blocks in every function which looks bad. Please suggest a better way to handle errors in async node

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

To catch errors I have written if-else blocks in every function which looks bad. Please suggest a better way to handle errors in async node

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.");
           }
        });
Share Improve this question asked Jan 9, 2014 at 12:13 ElankeeranElankeeran 6,1849 gold badges42 silver badges57 bronze badges 1
  • If you don't want to write if(err) { callback(err) } all the time, you may want to look into using promises. Promises allow for automatic propagation of errors. You can add a single error handler for multiple functions. – Myrne Stol Commented Jan 9, 2014 at 12:46
Add a ment  | 

3 Answers 3

Reset to default 8

You can pass the error to async and catch it in the callback

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

You do too much stuff

Waterfall already have an internal error management.

callback(err, [results]) - An optional callback to run once all the functions have pleted. This will be passed the results of the last task's callback.

Try this

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.");
           }
        });
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./${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
    });
发布评论

评论列表(0)

  1. 暂无评论