Node JS + Express应用程序中的错误处理

时间:2017-12-11 07:33:24

标签: javascript node.js postgresql express

我正在使用Node JS(版本8.4.0),Express(版本4.15.3)和使用Passport(版本0.3.2)编写一个小型Web应用程序进行身份验证。

我正在使用PostgreSQL 9.6作为数据库。

我无法理解如何在我的应用程序中使用Promise处理错误。

我已将我的应用划分为路线(具有与通过http请求处理哪些路线相关的信息),视图(用于呈现页面的手柄模板)和模型(与数据库查询相关的功能)。

以下是模型的示例代码:

var helpers = require('./helpers'); //Has a function to perform db queries

exports.getCustomerDetails = (cust_id,cb)=>{

    var qs = 'select * FROM customers WHERE cust_id=($1)';
    var params = [cust_id];

    helpers.dbquery(qs,params,(error,results)=>{

        if(error){
            return cb(error);
        }

        return cb(null,results);

    });

}

目前,我在相应的路由处理程序中所做的是发送HTTP 500作为响应。

//Get Customer details based on cust_code as input

router.get('/getCustomerDetails',(req,res,next)=> {
    if (req.user) {

      var cust_code = req.query.value;

      db.getCustomerDetails(cust_code, (error, result) => {

        if (error) {
          res.sendStatus(500);
        }
        res.status(200).send(result);
      });
    } else {
      res.sendStatus(401);
    }
})

我想了解在两个级别处理错误的最佳方法是什么,即路由和数据库。

我阅读了一些关于错误处理的文章并搜索了Stackoverflow,但我无法将其作为任何类型开发的初学者。

请建议如何处理我的网络应用中的错误以及任何有助于我了解网络应用中错误处理的参考资料。

2 个答案:

答案 0 :(得分:0)

以下可以满足您的要求。创建一个promise,捕获对该promise的拒绝并返回你创建的promise而不是catch,这样调用者就可以再次捕获拒绝。

var helpers = require('./helpers'); //Has a function to perform db queries

exports.getCustomerDetails = (cust_id, cb) => {
  var qs = 'select * FROM customers WHERE cust_id=($1)';
  var params = [cust_id];
  //create a promise
  const p = new Promise(
    (resolve,reject) =>
      helpers.dbquery(qs, params, (error, results) =>
        (error)
          ? reject(error)
          : resolve(results)
      )
  );
  //catch the reject
  p.catch(
    error => {
      //... do something with the error on the db level
    }
  );
  //return the promise that DID NOT have the error caught
  return p;
};


router.get('/getCustomerDetails',(req,res,next)=> {
  if (req.user) {
    var cust_code = req.query.value;
    //getCustomerDetails returns a promise
    db.getCustomerDetails(cust_code)
    .then(
      result =>
        res.status(200).send(result)
    )
    .catch(
      error =>
      res.sendStatus(500)
    )
  } else {
    res.sendStatus(401);
  }
});

答案 1 :(得分:0)

从我的角度来看,最好的方法是处理路由层中的所有错误,以便根据接口正确格式化它们。想象一下,您将来通过GraphQL层更改REST API层,使用此方法您只需修改此层,而不是其他层。 从其他层抛出所有错误的方法:我通常创建一个Error对象并添加几个自定义属性,例如:

var error = Error();
error.code = 401;
error.log = true;
error. translate = true;
error.message = "Unauthorized";
....
throw error;

在路线图层中,您可以捕获错误并使用所有数据创建自定义响应。它灵活而强大。

希望它有所帮助。