Node.js异常处理程序,如果验证错误

时间:2018-04-19 18:27:26

标签: javascript node.js oop express error-handling

我是node.js环境中的新手。我以前编码dotNet,我试图习惯node.js.

我在MVC .net中创建的项目,我使用中间件进行异常处理程序,如果发生验证错误,我抛出 CustomException ,其中有一个属性描述错误是否验证错误。

我正在尝试在express.js中执行此策略。我使用express-validator

router.post("/register", validators, (req, res) => {

    validationResult(req).throw();

    var userDto = req.dto;
    userService.registerUser(userDto)
        .then(result => {
            res.status(200).send("User Created Succesfully");
        }).
        catch(err => {
            //log it,
            res.status(500).send("");
        })
})

如果发生错误,experss-validator会在“Validation failed”消息

时抛出错误

全局错误处理程序,如

app.use((err,req,res,nex)=>{
    if(err.message ==='Validation failed'){
        console.log(err);
        res.status(422).send(err.array());
    }
    console.log(err);

});

正如您在错误处理程序中看到的那样,我试图通过控制错误消息来了解错误是否是验证错误。看起来很难看,不是吗?

总的来说,我还没有在node.js中看到过这种方法。它可能是单一责任或其他东西的抽象吗?似乎node.js试图保持简单的错误东西。我正在遭受缺乏这种机制的困扰。也许我在做反模式,但我无法理解。如果你有更好的方法,我会立即放弃我的:)

感谢。

3 个答案:

答案 0 :(得分:1)

一般来说,在Node.js世界中,错误通常很简单。与C#不同,您通常只会看到一个异常/错误类型:Error

您可以自由创建自己的错误对象(使用ES2015 classes syntax):

class MyError extends Error {
  constructor(message) {
    super(message);
  }
}

然后您可以像在C#中一样检查类型:

const myError = new MyError();
console.log(myError instanceof MyError)

但是,您通常不会看到项目/人员创建自己的错误。通常会发生的事情是他们只是使用标准Error对象,而是使用您在上面检查的特定错误消息。但是,您可以自由添加额外的属性(有些人这样做)以帮助区分Error个对象:

const stdError = new Error()
std.myCustomProperty = 'whoohoo'

优良作法是利用你正在做的error middleware来处理错误。

我有一个示例MVC样式的Express项目,您可以查看更好的(IMO)方法来处理错误:https://github.com/ciscoo/evaluacion

编辑:从Node.js v10.0.0开始,所有Error个对象都将具有code属性。

答案 1 :(得分:0)

您希望在控制器级别捕获任何验证错误,全局错误处理程序用于捕获您的控制器可能遗漏的任何内容(例如404)。

router.post('/register', validators, (req, res) => {

  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(422).json({ errors: errors.mapped() });
  }

  var userDto = req.dto;
  userService.registerUser(userDto)
    .then(result => {
      res.status(200).send("User Created Succesfully");
    }).
    catch(err => {
      //log it,
      res.status(500).send("");
  });
});

或者使用throw语法:

router.post('/register', validators, (req, res) => {

  try {
    validationResult(req).throw();
  } catch (errors) {
    return res.status(422).json({ errors: errors.mapped() });
  }

  var userDto = req.dto;
  userService.registerUser(userDto)
    .then(result => {
      res.status(200).send("User Created Succesfully");
    }).
    catch(err => {
      //log it,
      res.status(500).send("");
  });
});

答案 2 :(得分:0)

我们可以通过使用<div id="root"></div> 类扩展来在Javascript中创建自定义错误

例如:

dateVal = new Date(dateStr)