Javascript 如何在Sails.js中引发自定义错误消息
我对Sails.js(0.9.13)和一般的节点式编程非常陌生。谢谢你的帮助。下面的示例来自UserController:Javascript 如何在Sails.js中引发自定义错误消息,javascript,node.js,error-handling,sails.js,Javascript,Node.js,Error Handling,Sails.js,我对Sails.js(0.9.13)和一般的节点式编程非常陌生。谢谢你的帮助。下面的示例来自UserController: module.exports = { save: function (req, res) { var u = { firstName: req.param('firstName'), lastName: req.param('lastName'), email: re
module.exports = {
save: function (req, res) {
var u = {
firstName: req.param('firstName'),
lastName: req.param('lastName'),
email: req.param('email'),
password: req.param('password'),
};
User.create(u).done(function(err,user){
if(err) {
if( err.code == 'ER_DUP_ENTRY' ) {
return new Error('Duplicate: email address already in use.','UserController');
}
console.log( err );
return;
}
console.log( user );
});
}
}
return res.view('duplicateEmail');
因此,我试图捕获“ER_DUP_ENTRY”错误代码并返回一条自定义错误消息,但我在编写时运气不佳。我到底应该怎么做 如果您打算将错误返回给客户端,有几种方法,但都是从作为参数传递给控制器操作的开始。所有最新版本的SAIL都有一些基本的错误响应烘焙到该对象中,因此您可以执行以下操作(例如): 而不是
返回新错误
,以显示带有500状态代码的常规错误页面。对于不需要HTML的仅JSON API调用,它将发送一个包含状态代码和错误的简单对象。还有:
res.notFound() // 404 response
res.forbidden() // 403 response
res.badRequest() // 400 response
对于“重复输入”错误,您可能需要更定制的内容。由于您的示例来自表单帖子,因此最佳做法是将错误实际保存为flash消息,并重定向回表单页面,例如:
res.serverError(err)
req.flash('error', 'Duplicate email address');
return res.redirect('/theView');
然后在表单视图中,使用以下方式显示错误:
<% if (req.session.flash && req.session.flash.error) { %><%=req.flash('error')%><% } %>
如果您正在响应API调用,则需要发送状态代码和(可能)JSON对象:
return res.json(409, {error: 'Email address in use'});
关键是,您不想在控制器代码中返回(或抛出)一个
错误
对象,而是想使用res
对象以某种方式响应请求。此代码在什么条件下运行?它是响应常规HTML表单post、AJAX post、API消费者的请求还是其他什么?这将决定您应该发送的响应类型。此外,我希望您不是真正从Sails 0.9.0开始。最新的稳定版本是0.9.13。是时候升级了@是的,最新航次是0.9.13。这是在th UserController中运行的,作为对直接向上表单帖子的响应。我的问题实际上是关于如何检测和或拦截create函数的ER_DUP_条目,以便打包适当的回复。然后,是的,所述响应的打包需要与调用类型相适应。@RSAdmin您知道User中是否可以访问“ER\u DUP\u ENTRY”。findOrCreate()我一直得到一个ER\u UKNOWN,但在进一步读取它时,由于重复的条目编辑而清除了它:或者我完全错了,而ER_DUP_条目来自sails mysql,而不是sails内存……这正是我所寻求的答案。谢谢你,斯科特。(一个问题:在示例代码中这是否正确:
?同一行上的另一个参考查看req.session.flash.error
…是--实际调用req.flash('error'))
将检索并清除flash消息,而访问req.session.flash.error
只是检查它是否存在。它不应该返回res.json({error:'Email address in use'},409);
指定res.json(obj[,headers | status[,status]]
@ScottGress给定的示例似乎失败,在v0.10.0-rc8中出现了一个无法读取未定义的属性“error”。您可以建议另一种方法来检查是否存在错误吗?谢谢!@dbasch很好,该示例没有先检查req.session.flash
。现在更新。您可以通过从控制器并设置flash
local,如res.view({flash:req.flash()})
,然后只执行
,但如果您的路线直接指向视图,则这是不可能的。