Javascript Node.js异常处理程序,如果其验证错误,则指定错误
我是node.js环境中的新手。我曾经编写过dotNet代码,现在正努力适应node.js 我在MVC.net中创建的项目,我使用中间件作为异常处理程序,如果发生验证错误,我将抛出CustomException,该属性描述错误是否为验证错误 我正在尝试在express.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();
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'