我是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试图保持简单的错误东西。我正在遭受缺乏这种机制的困扰。也许我在做反模式,但我无法理解。如果你有更好的方法,我会立即放弃我的:)
感谢。
答案 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)