Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js异常处理程序,如果其验证错误,则指定错误_Javascript_Node.js_Oop_Express_Error Handling - Fatal编程技术网

Javascript Node.js异常处理程序,如果其验证错误,则指定错误

Javascript Node.js异常处理程序,如果其验证错误,则指定错误,javascript,node.js,oop,express,error-handling,Javascript,Node.js,Oop,Express,Error Handling,我是node.js环境中的新手。我曾经编写过dotNet代码,现在正努力适应node.js 我在MVC.net中创建的项目,我使用中间件作为异常处理程序,如果发生验证错误,我将抛出CustomException,该属性描述错误是否为验证错误 我正在尝试在express.js中执行此策略。我使用快速验证器 router.post("/register", validators, (req, res) => { validationResult(req).throw();

我是node.js环境中的新手。我曾经编写过dotNet代码,现在正努力适应node.js

我在MVC.net中创建的项目,我使用中间件作为异常处理程序,如果发生验证错误,我将抛出CustomException,该属性描述错误是否为验证错误

我正在尝试在express.js中执行此策略。我使用快速验证器

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验证程序将抛出一个带有“验证失败”消息的错误

全局错误处理程序

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试图保留简单的错误信息。我正在忍受缺乏这种机制的痛苦。也许我在做反模式的事情,但我想不出来。如果你有更好的方法,我会立即放弃我的:)


谢谢。

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

或者使用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("");
  });
});

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

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

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

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

const stdError = new Error()
std.myCustomProperty = 'whoohoo'
利用您正在做的工作来处理错误是一种很好的做法

我有一个MVC风格的Express项目示例,您可以查看它,以找到更好的(IMO)方法来处理错误:


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


我们可以通过扩展
Error
类,在Javascript中创建自定义错误

例如:

类验证错误扩展错误{
构造函数(消息){
超级();
Error.captureStackTrace(this,this.constructor);
this.name=this.constructor.name;
this.message=消息;
}
}
类NotFoundError扩展错误{
构造函数(消息){
超级();
Error.captureStackTrace(this,this.constructor);
this.name=this.constructor.name;
this.message=消息;
该代码=404;
}
}

“我抛出了一个自定义异常,该异常具有一个属性,用于描述错误是否为验证错误。”-在JS中也可以这样做。错误是对象,您可以为其指定所需的任何属性。(不过,您可能需要修补/包装
express validator
)请不要将所有文本放在代码块中。这会使它更难阅读。
class MyError extends Error {
  constructor(message) {
    super(message);
  }
}
const myError = new MyError();
console.log(myError instanceof MyError)
const stdError = new Error()
std.myCustomProperty = 'whoohoo'