在执行 await fetch 时获取 response.message 自定义消息

Getting response.message custom message when doing await fetch

提问人:goxarad784 提问时间:8/7/2023 更新时间:8/7/2023 访问量:62

问:

我的 Nodejs express 后端中有一个错误处理程序,可以捕获一些错误并将其发送到客户端:

res.status(error.status|| 500).json({
      status: error.status||500,
      message: 'MY CUSTOM ERROR MESSAGE',
      stack: error.stack
})

我使用jquery ajax的时间最长,并且总是能够像这样从后端获取消息的值:

$.ajaxSetup({
    error(jqXHR, exception) {
      $('#divSubmitButtonSpinAnimation').addClass('d-none');

      console.log(jqXHR);
      console.log(exception);
      $.toast({
        position: 'top-right', /** top-left/top-right/top-center/bottom-left/bottom-right/bottom-center - Where the toast will show up * */
        dismissible: true, /** true/false - If you want to show the button to dismiss the toast manually * */
        stackable: true, /** true/false - If you want the toasts to be stackable * */
        pauseDelayOnHover: true, /** true/false - If you want to pause the delay of toast when hovering over the toast * */
        title: jqXHR.statusText,
        subtitle: jqXHR.status,
        content: (jqXHR.responseJSON) ? jqXHR.responseJSON.message : 'Unspecified Error',
        type: 'error',
        delay: 5000,
      });

     
      return false;
    },
  });

但是,我现在正在研究上传文件的能力,并且在使用 jquery ajax 时遇到了问题,所以我决定开始使用 await fetch api。我的大部分工作都工作,除了,我无法再读取的值,因为它未定义。response.message

const response = await fetch(
      '/getStudentInfo',
      {
        headers: {
          Accept: 'application/json',
        },
        method: 'POST',
        body: formData,
      },
    );
    if (response.status === 200) {
      return response.json();
    }

    console.log(response.message)

response.message 未定义,但 response.status 为 500,response.statusText 为“内部服务器错误”,这是预期的,因为我从服务器发送错误 500。

Node.js Ajax Express

评论

0赞 Konrad 8/7/2023
用于捕获错误try... catch
0赞 goxarad784 8/7/2023
try...catch当有响应 500 时,catch 块不会触发。当我把它包装起来时,try catch is 返回状态 500,但不转到 catch 块

答:

0赞 goxarad784 8/7/2023 #1

所以看起来我必须将响应转换为才能获得消息属性。所以我做的是这样的。json

 const response = await fetch(
      '/createInspectionDetail',
      {
        headers: {
          Accept: 'application/json',
        },
        method: 'POST',
        body: formData,
      },
    );
    if (response.status === 200) {
      return response.json();
    }

    const data = await response.json();

    createGenericMessage('Error', data.message, 'danger');

显然这是必要的,因为 reponse 本身就是另一个承诺,一旦标头到达,我们就会到达,因此我们仍然需要等待它以获取更多信息:

在此处阅读更多详细信息:

为什么 .json() 会返回 promise?

1赞 Bergi 8/7/2023 #2

即使 http 状态不是 200,仍需要调用才能访问响应正文中的消息。response.json()

const response = await fetch('/getStudentInfo', {
  headers: {
    Accept: 'application/json',
  },
  method: 'POST',
  body: formData,
});
const data = response.headers.get("content-type")?.startsWith("application/json"))
  ? await response.json()
  : await response.text();

if (response.ok) {
  console.log(data);
} else {
  console.error(data.message);
}