【问题标题】:Error sending error to client side in nodeJs在nodeJs中向客户端发送错误时出错
【发布时间】:2017-02-14 18:49:05
【问题描述】:

我在 nodeJS 中使用异步,在我的最终回调中,我正在处理错误并尝试将其发送回我的角度控制器。

 function (err, data) {
        if (err) {
            console.log(err);
            res.status(500).send({ err : err});
        }
        else {
            res.json({data: data});
        }
    });

现在控制台中的错误是。

[Error: Username is already in use]

我无法在我的角度控制器中收到此特定错误我尝试以所有组合发送错误,例如。

   res.status(500).send({ err : err[0]});
      res.status(500).send({ err : err.Error});

这是我在前端得到的。

   Object {data: Object, status: 500, config: Object, statusText: "Internal Server Error"}
config
:
Object
data
:
Object
err
:
Object
__proto__
:
Object
__proto__
:
Object
headers
:
(d)
status
:
500
statusText
:
"Internal Server Error"

如何将用户名使用中的错误带到我的前端。

【问题讨论】:

  • 你的函数是做什么的?
  • res.status(500).send({ err : err});,这里我试图发送 err,其中 err 是 [Error: Username is already in use],但它不是去前端。
  • 为什么不返回 ok 状态,错误 500 是针对服务器错误而不是数据验证错误
  • 但我希望 [Error: Username is already in use] 向用户显示
  • 前端{data: Object的值是多少?

标签: javascript angularjs node.js


【解决方案1】:

500 错误通常是为服务器错误保留的,而不是用于您所描述的场景。服务器错误应该由您的服务器处理并优雅地呈现给您的前端。客户端错误应该在 400 秒以内。为什么不试试409400

res.status(409).json({error: "Username is already taken"});

查看HTTP Status codes了解更多信息:

409 冲突 由于与资源的当前状态冲突,无法完成请求。仅在预期用户可能能够解决冲突并重新提交请求的情况下才允许使用此代码。响应正文应该包含足够的信息让用户识别冲突的来源。理想情况下,响应实体将包含足够的信息供用户或用户代理解决问题;但是,这可能是不可能的,也不是必需的。

在响应 PUT 请求时最有可能发生冲突。例如,如果正在使用版本控制并且被 PUT 的实体包括对资源的更改,这些更改与早期(第三方)请求所做的更改相冲突,则服务器可能会使用 409 响应来指示它无法完成请求.在这种情况下,响应实体可能会以响应 Content-Type 定义的格式包含两个版本之间差异的列表。

注意:另外,作为一种良好做法,请确保返回您的 res. 函数,以实现可预测的控制流,如下所示:

return res.status(409).json({error: "Username is already taken"});

【讨论】:

  • 无论如何,谢谢,我改变了这个回调(new Error(messages.phonenumberInUse));回调(messages.phonenumberInUse);现在我可以在浏览器中以 406 状态看到它。
  • @sacDahal 从纯粹的 RESTful 角度来看,我认为您应该使用 409400。这是吹毛求疵,但 REST 很棒 :) 我也更新了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 2016-10-27
  • 2018-03-08
  • 2018-04-26
  • 1970-01-01
  • 2016-12-20
  • 2019-01-26
相关资源
最近更新 更多