使用Javascipt和Node.js处理错误(然后/捕获)

时间:2019-09-28 17:49:51

标签: javascript node.js express error-handling try-catch

假设我在route.js文件中包含以下伪代码:

var pkg = require('random-package');

app.post('/aroute', function(req, res) {
    pkg.impl_func(data, function (err, result) {
        myFunction(entity).then(user=>{
            //DO_STUFF_HERE
            res.render('page.ejs');
        }).catch(err => {
            console.log(err);
            res.render('error.ejs');
        });
    });
});

function myFunction(username) {
   //.....
}

我使用的pkg是在npmjs网站上找到的。 myFunction()永远是我的职责。

在我的代码中,您可以看到当myFunction()失败时,我已经实现了then / catch语句。 因此,发生这种情况时,将呈现error.ejs

但是当npm软件包失败时会发生什么? 在终端中,我收到错误消息,但是服务器端没有错误处理。 这意味着,当失败时,error.ejs不会通知用户,这很明显,因为我的代码中省略了此功能。

但是当pkg失败时,呈现error.ejs的方法是什么?

由于我已经在下面使用.then()/.catch()技术,因此我也可以在上面使用它吗? 换句话说,我可以嵌套.then()/.catch()语句吗? 我可以在try/catch周围加上外部代码吗(同时内部仍然有try/catch?)

2 个答案:

答案 0 :(得分:2)

pkg.impl_func()似乎是在实现典型的Node.js回调接口(即,如果发生错误,它将作为第一个参数返回错误;如果没有错误,则返回null)。您可以简单地检查错误的存在并在出现error.ejs时对其进行渲染:

app.post('/aroute', function(req, res) {
  pkg.impl_func(data, function (err, result) {
    if (err) {
      res.render('error.ejs');
    } else {
      myFunction(entity).then(user=>{
        //DO_STUFF_HERE
        res.render('page.ejs');
      }).catch(err => {
        console.log(err);
        res.render('error.ejs');
      });
    }
  });
});

或者,您可以使用util.promisify()pkg.impl_func()转换为异步函数。然后,您可以在promise.catch()函数内使用try-catchasync来简化语法:

const util = require('util')
const impl_func_async = util.promisify(pkg.impl_func)

// traditional promises:
app.post('/aroute', (req, res) => {
  impl_func_async(data).then(result =>
    return myFunction(entity)
  }).then(user => {
    // DO_STUFF_HERE
    res.render('page.ejs')
  }).catch(e => {
    // Will catch thrown errors from impl_func_async and myFunction
    console.log(e)
    res.render('error.ejs')
  })
})

// async-await:
app.post('/aroute', async (req, res) => {
  try {
    const result = await impl_func_async(data)
    const user = await myFunction(entity)
    // DO_STUFF_HERE
    res.render('page.ejs')
  } catch (e) {
    // Will catch thrown errors from impl_func_async and myFunction
    console.log(e)
    res.render('error.ejs')
  }
})

答案 1 :(得分:0)

您可以使用一个简单的try/catch来封装它们,并在该捕获中呈现error.js

关于嵌套try/catch ...是的。但是,在这种情况下,承诺catch()与基本try/catch

略有不同
app.post('/aroute', function(req, res) {

      try {
        pkg.impl_func(data, function(err, result) {
          myFunction(entity).then(user => {
            //DO_STUFF_HERE
            res.render('page.ejs');
          }).catch(err => {
            console.log(err);
            res.render('error.ejs');
          });
        });

      } catch (e) {
        res.render('error.ejs');
      }
    });
});