【问题标题】:How to raise custom error message in Sails.js如何在 Sails.js 中引发自定义错误消息
【发布时间】:2014-03-22 01:33:57
【问题描述】:

我对 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”错误代码并返回自定义错误消息,但我没有写的那么幸运。我到底应该怎么做?

【问题讨论】:

  • 这段代码是在什么条件下运行的?它是响应常规的 HTML 表单帖子、AJAX POST、来自 API 使用者的请求还是其他什么?这将决定您应该发送的响应类型。
  • 另外,我希望你不是真的从 Sails 0.9.0 开始。最新的稳定版本是 0.9.13。是时候升级了!
  • @ScottGress 是的,最新的 Sails 0.9.13。这是在用户控制器中运行的,作为对直接表单帖子的响应。我的问题实际上是关于如何检测和/或拦截创建函数的 ER_DUP_ENTRY 以便我可以打包适当的回复。然后,是的,所述响应的包装需要适合调用类型。
  • @RSAdmin 你知道在 User.findOrCreate() 中是否可以访问 'ER_DUP_ENTRY' 我一直得到一个 ER_UKNOWN 但在进一步阅读它时清除它是由于重复的条目编辑:或者我拥有这一切错了,ER_DUP_ENTRY 来自sails-mysql 而不是sails-memory...

标签: javascript node.js error-handling sails.js


【解决方案1】:

如果您打算将错误返回给客户端,有几种方法可以使用,但所有方法都以 res object 开头,它作为参数传递给您的控制器操作。所有最新版本的 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'});

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

【讨论】:

  • 正是我正在寻找的答案。谢谢斯科特。 (一个问题:这在您的示例代码中是否正确:&lt;%=req.flash('error')%&gt; ?同一行上的另一个参考查看req.session.flash.error ...
  • 是的——实际上调用req.flash('error') 将检索并清除 flash 消息,而访问req.session.flash.error 只是检查它是否存在。
  • 不应该是return res.json({error: 'Email address in use'}, 409);吗? The docs 指定res.json(obj[, headers|status[, status]])
  • @ScottGress 给定的示例在 v0.10.0-rc8 中似乎以 Cannot read property 'error' of undefined 失败。您能否提出另一种检查错误存在的方法?谢谢!
  • @dbasch 很好,该示例没有首先检查req.session.flash。现在更新了。您可以通过从控制器提供视图并设置 flash 本地(如 res.view({flash: req.flash()}))来避免这种情况,然后只需执行 &lt;% if (flash.error) { %&gt;&lt;%=flash.error%&gt;&lt;% } %&gt;,但如果您的路由直接指向视图,则这是不可能的。
猜你喜欢
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多