如何在Sails.js中引发自定义错误消息

时间:2014-03-22 01:33:57

标签: 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: 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 );
        });
   }
}

所以我想抓住' ER_DUP_ENTRY'错误代码并返回自定义错误消息,但我写的没有运气。我该怎么做呢?

1 个答案:

答案 0 :(得分:12)

如果您打算将错误返回给客户端,有几种方法可以使用,但所有这些方法都以res object开头,该{{3}}作为参数传递给您的控制器操作。所有最新版本的Sails都会在该对象中添加一些基本的错误响应,因此您可以这样做(例如):

res.serverError(err)

而不是return new Error以显示包含500状态代码的常规错误页面。对于不希望使用HTML的仅限JSON的API调用,它会发送一个包含状态代码和错误的简单对象。还有:

res.notFound() // 404 response
res.forbidden() // 403 response
res.badRequest() // 400 response

对于您的"重复输入"错误,你可能想要更多定制的东西。由于您的示例来自表单帖子,因此最佳做法是将错误实际保存为Flash消息并重定向回表单页面,例如:

req.flash('error', 'Duplicate email address');
return res.redirect('/theView');

然后在表单视图中,使用以下内容显示错误:

<% if (req.session.flash && req.session.flash.error) { %><%=req.flash('error')%><% } %>

作为替代方案,您只需从控制器中显示自定义错误视图:

return res.view('duplicateEmail');

如果您正在回复API调用,那么您将要发送状态代码和(可能)JSON对象:

return res.json(409, {error: 'Email address in use'});

关键是,您希望使用Error对象以某种方式响应请求,而不是在控制器代码中返回(或抛出)res对象。