如何处理在Express,NodeJS中从路由处理程序调用的函数中的错误?

时间:2017-04-07 13:52:20

标签: node.js express error-handling

这可能是非常愚蠢的,但我对此并没有太多了解,因为我不明白我应该如何搜索它。

我有一个路由处理程序可以根据一些请求参数调用不同的函数,我想知道处理函数内部错误的最佳方法是什么,以便将错误传递给错误处理中间件。 考虑这样的事情:

router.get('/error/:error_id', (req, res, next) => {
    my_function();
}

function my_function(){
  // do something async, like readfile
  var f = fs.readFile("blablabla", function (err, data) {
      // would want to deal with the error
  });
}

如果在fs.readFile期间发生错误,如何将错误传递给next以将其转发到错误中间件?唯一的解决方案是将下一个参数传递给函数函数my_function(next){...}

如果函数没有调用任何异步I / O操作,路由处理程序中的简单try/catch就可以了(我想),如下所示:

router.get('/error/:error_id', (req, res, next) => {
    try{
      my_function();
    } catch(e){
      next(e);
    };
}

function my_function(){
  // do stuff
  var f = fs.readFileSync("blablabla"); // possibly throws an error
}

希望我有所作为。

1 个答案:

答案 0 :(得分:1)

完全正确的是,您应该将next回调传递给my_function,因为fs.readFile是异步的。

router.get('/error/:error_id', (req, res, next) => {
  my_function(next);
}

function my_function(next) {
  fs.readFile("blablabla", function (err, data) {
    if (err) {
      next(err);
    } else {
      // Process the data
      // Don't forget to call `next` to send respond the client
    }
  });
}

顺便说一句,你做不到

var f = fs.readFile(...)

因为fs.readFile是异步的。应该在回调中处理数据。