是否所有错误消息都应该以可以向用户显示的形式来自后端?

Dev*_*low 21 javascript node.js reactjs

在这种情况下,我使用 axios 库以及成功和不成功请求的拦截器,以便在出现错误时自动从服务器获取并显示带有错误文本的警报。
因此,我的后端开发人员向我发送了不适合输出到警报的错误消息,认为该消息是我必须自己生成错误,但仅需要来自服务器的内容,以便我了解错误。他是对的吗?或者从后端发送错误消息应该严格类似于response.message并匹配 UI 上向用户显示的错误格式?

我所说的通用错误拦截器看起来是这样的,但是它每次发送给我的错误都在不同的路径上,而且它们的格式不适合向用户显示,并且经常会收到一个包含错误的数组。他做的事正确吗?

因为在这种情况下,我无法使用下面的代码来处理错误

const API = axios.create({
  baseURL: '/api/',
  responseType: 'json',
  headers: { 'cache': 'no-store' },
})

const onFulfilled = (response) => response.data


const onRejected = (error) => {
  if (error.response?.status === 500) {
    notify(error.response.statusText || ' Internal server error', 'error')
  } else if (error.response?.data.message) {
    notify(error.response.data.message, 'error')
  } else {
    notify('Oops something went wrong', 'error')
  }
  ..... and so on
  return Promise.reject(error)
}

API.interceptors.response.use(onFulfilled, onRejected)
Run Code Online (Sandbox Code Playgroud)

sle*_*ica 35

这是一个典型的困境,尤其是当项目还很年轻并且一切都发生得很快时。有一个立即的答案(而且是正确的!),但是这意味着什么并不是立即显而易见的。

规则

一般来说,后端软件通知前端软件,前端软件通知人类用户

这意味着您的后端应该发送供程序解析的错误信息,而您的前端应该将其解释并转换为人们的语言和用户界面。

然而,这对双方来说都是工作。您的服务器应该以易于使用的形式发送足够的信息。让我举一个例子:

{ 
   errorCode: ERROR_INVALID_SOMETHING, 
   errorData: { something: 8, maxSomething: 5 }
}
Run Code Online (Sandbox Code Playgroud)

前端代码可以轻松解释这一点并为人类用户生成适当的消息,例如“抱歉!某些值必须低于 5,而 8 太高了”。你最终会得到这样的结果:

switch (response.errorCode) {
    case ERROR_INVALID_SOMETHING:
        ...
}
Run Code Online (Sandbox Code Playgroud)

反规则

如果服务器发送没有标准或稳定性保证的不可解析的字符串,则很难实现这一点。一个令人震惊的例子:

{
    error: "InvalidSomethingException at server.x:15 maxSomething=5 but something is '8'"
}
Run Code Online (Sandbox Code Playgroud)

前端代码无法处理此问题。如果您认为字符串可能因任何原因而更改(例如错误类型发生更改),情况会变得更糟。

例外情况

在一系列情况下,向用户显示原始服务器端字符串不仅是可以接受的,而且是必不可少的:当您想要将特定情况的自定义消息发送到无法轻松升级的软件时。

例如,您突然发现一个使用户面临风险的错误,需要立即进行维护。您希望尽快向用户发送消息,并且迫不及待地等待应用商店在接下来的 5 个工作日内批准更新。

如果您的软件已准备好针对这种可能性显示自定义消息,那么现在是这样做的好时机 -但数据也应该遵循良好的结构。例如:

errorCode: ERROR_CUSTOM
errorData: {
    en: "We need to inform you about something right now",
    es: "Necesitamos informarte de algo ya mismo"
}
Run Code Online (Sandbox Code Playgroud)

请注意,这遵循类似的结构,并且前端代码仍然可以使用标准。

结论

您应该与后端团队坐下来,就如何构建错误及其元数据达成共识。

这可能需要一些工作才能开始,因为您需要定义和可能的重构,但可以扩展到非常复杂的场景,并且您可能永远不需要再次修改代码。

  • 这值得更多的声誉。谢谢@slezica (2认同)