Javascript 使用Node/Express正确处理错误

Javascript 使用Node/Express正确处理错误,javascript,node.js,express,Javascript,Node.js,Express,一般来说,哪种方法可以返回服务器错误(node/express)并拒绝承诺 A)如下:res.json({status:1,消息:“Test missing phone.”,错误:“phone”}) 然后从前端的error中提取错误“code”,并从message中提取消息,从而实现包含错误和消息的承诺 B)像这样 res.status(500) res.json({message: 'Test missing phone.'}) 然后只需拉出消息并调用。拒绝带有消息的。或者res.err

一般来说,哪种方法可以返回服务器错误(node/express)并拒绝承诺


A)如下:
res.json({status:1,消息:“Test missing phone.”,错误:“phone”})

然后从前端的
error
中提取错误“code”,并从
message
中提取消息,从而实现包含
错误和
消息的承诺


B)像这样

res.status(500)
res.json({message: 'Test missing phone.'})
然后只需拉出
消息
并调用
。拒绝带有消息的
。或者
res.error
什么的


这两种情况是否都会导致“拒绝”承诺或“错误”回调,从而使前端工作变得更容易

当我得到一个错误时,我应该导致承诺/回调拒绝,还是仅仅发送一个已实现的承诺并在对象(如a)中包含一个错误

以下哪种是将错误从服务器返回到前端的“正确”方法

目前我使用方法A,但它看起来相当愚蠢,因为我必须处理两次错误,后端(实际发送自定义错误)和前端(检查履行的承诺是否有错误对象,然后显示弹出窗口)。方法B将消除“检查履行的承诺是否有错误对象”部分,因为被拒绝的承诺本质上是错误

编辑:我使用React Native作为前端

EDIT2:如果你
res.status(500).json({test:'test missing phone.})
在你的后端,你可以
console.log(error.response.data)
在前端,使“B”成为一个可行的选项。

TL;使用你的“B”方法 取决于您在前端使用的是什么。如果它是有角度的,并且您使用的是
$http
对象,那么如果存在错误状态(例如,
400
状态代码),则承诺将被拒绝

因此,为了让前端自动“知道”何时出现错误(而不必进行额外的检查以查看正文是否包含错误消息),您可能应该使用后端的
res.status()
方法。HTTP状态码是前端了解服务器中发生了什么情况时应该使用的模型,大多数前端HTTP库都是基于此模型构建的

如果您愿意,也可以在回复正文中发送其他信息。您可以在前端使用自定义应用程序代码来处理更细粒度的错误情况。例如,401状态会告诉客户机他们无权在服务器上执行某些操作,而带有
code
成员的主体可能会进一步准确定义问题所在,以及一些人类可读的描述(在您的示例中,您已经将其作为
消息
);使用你的“B”方法 取决于您在前端使用的是什么。如果它是有角度的,并且您使用的是
$http
对象,那么如果存在错误状态(例如,
400
状态代码),则承诺将被拒绝

因此,为了让前端自动“知道”何时出现错误(而不必进行额外的检查以查看正文是否包含错误消息),您可能应该使用后端的
res.status()
方法。HTTP状态码是前端了解服务器中发生了什么情况时应该使用的模型,大多数前端HTTP库都是基于此模型构建的


如果您愿意,也可以在回复正文中发送其他信息。您可以在前端使用自定义应用程序代码来处理更细粒度的错误情况。例如,401状态会告诉客户机他们无权在服务器上执行某些操作,而带有
code
成员的主体可能会进一步精确定义问题所在,以及一些人类可读的描述(在您的示例中,这些描述已经作为
消息
)。

添加到
res.status中(500)
在最佳实践方面是合适的。如果您说“您的服务器有错误”,您应该明确地将响应标记为“错误”-即响应代码500,它正好表明了这一点

虽然您知道应该得到什么样的响应,但如果这是您与他人一起开发的项目,或者是要向公众共享的API,那么不获得
500
,似乎是违反直觉的。发送该500将使处理错误更加简单,无论是使用承诺还是普通ajax


也就是说,没有理由您不能包含您在A部分提到的完整JSON对象(即
{status:1,message:'Test missing phone',error:'phone'}
),以向前端提供更多信息。

添加
res.status(500)
在最佳实践中是正确的。如果您说“服务器有错误”,您应该明确地将响应标记为“错误”-即响应代码500,它正好表明了这一点

虽然您知道应该得到什么样的响应,但如果这是您与他人一起开发的项目,或者是要向公众共享的API,那么不获得
500
,似乎是违反直觉的。发送该500将使处理错误更加简单,无论是使用承诺还是普通ajax


也就是说,没有理由您不能包含您在A部分提到的完整JSON对象(即
{status:1,message:'Test missing phone',error:'phone'}
),以向前端提供更多信息。

谢谢您的回答-但是如果我使用“B”,我如何访问“message”-它实际上似乎没有通过,我只是得到了
错误:请求失败,状态代码为500
。我正在使用axios,如果这很重要,我会以本机方式进行响应。
错误。消息
是一样的-我需要自定义错误消息。例如,如果我
res.status(500)