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

RSA*_*min 3 javascript error-handling node.js 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 );
        });
   }
}
Run Code Online (Sandbox Code Playgroud)

所以我试图捕获'ER_DUP_ENTRY'错误代码并返回自定义错误消息,但我写的没有运气.我该怎么做呢?

sgr*_*454 12

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

res.serverError(err)
Run Code Online (Sandbox Code Playgroud)

而不是return new Error显示具有500状态代码的一般错误页面.对于不期望HTML的仅JSON API调用,它将发送一个带有状态代码和错误的简单对象.还有:

res.notFound() // 404 response
res.forbidden() // 403 response
res.badRequest() // 400 response
Run Code Online (Sandbox Code Playgroud)

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

req.flash('error', 'Duplicate email address');
return res.redirect('/theView');
Run Code Online (Sandbox Code Playgroud)

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

<% if (req.session.flash && req.session.flash.error) { %><%=req.flash('error')%><% } %>
Run Code Online (Sandbox Code Playgroud)

或者,您可以从控制器中显示自定义错误视图:

return res.view('duplicateEmail');
Run Code Online (Sandbox Code Playgroud)

如果您正在响应API调用,则需要发送状态代码和(可能)JSON对象:

return res.json(409, {error: 'Email address in use'});
Run Code Online (Sandbox Code Playgroud)

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

  • 是的 - 实际调用`req.flash('error')`将检索*并清除*flash消息,而访问`req.session.flash.error`只是检查它是否存在. (2认同)