在NodeJs中向客户端发送错误时出错

5

我正在使用nodeJS中的async,在我的最终回调函数中,我处理错误并尝试将其发送回我的angular控制器。

 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]

我无法在我的Angular控制器中获取特定的错误,我尝试了发送所有组合的错误信息。

   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: 用户名已被使用],但它无法传递到前端。 - sac Dahal
为什么不返回一个OK状态,而是使用错误500来表示服务器错误而不是数据验证错误。 - madalinivascu
但我希望向用户显示 [错误:用户名已被使用] - sac Dahal
前端中 {data: Object} 的值是什么? - abdulbarik
err没有我发送的错误。 - sac Dahal
显示剩余3条评论
1个回答

6

500 错误通常是服务器错误,而不是像您描述的情况。服务器错误应该由服务器处理并优雅地呈现给前端。客户端错误应该在400级别。为什么不尝试使用 409400

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

查看HTTP状态码以获取更多信息:HTTP状态码

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

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

注意: 另外,作为一种好的实践,确保您返回 res. 函数,以获得可预测的流程控制,像这样:

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

不管怎样,我把这个回调函数(callback)从callback(new Error(messages.phonenumberInUse))改成了callback(messages.phonenumberInUse),现在我可以在浏览器中看到它的406状态了。 - sac Dahal
从纯粹的RESTful角度来看,我认为你应该选择409400。这有点挑剔,但REST很棒:) 我也更新了答案。 - nikjohn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接