当前位置: 首页 > 知识库问答 >
问题:

如何使用ecmascript-6和fetch api获取自定义服务器端错误消息?

太叔昊苍
2023-03-14

当客户端获取请求导致服务器端出错时,我想返回一个错误代码(400)和一条自定义消息。我不知道如何使用fetch和promissions在客户端优雅地检索这两者。

return fetch('/api/something')
    .then(response => response.json())
    .then(json => {
         console.log(json.message)
        // I only have access to the json here.
        // I'd also like to get the response status code 
        // (from the response object) and potentially 
        // throw an error complete with the custom message.
    })
    .catch(function(ex) {
        console.log('Unhandled Error! ', ex);
    });

谢谢

共有2个答案

叶建柏
2023-03-14

回答我自己的问题。

编辑

在阿米特和费利克斯的帮助下,我已经确定了下面的代码,因为它对我来说最容易阅读。

async function format(response) {
    const json = await response.json();
    return {response, json};
}

function checkStatus(response, json) {
    if (response.status < 200 || response.status >= 300) {
        var error = new Error(json.message);
        error.response = response;
        throw error;
    }
    return {response, json};
}

return fetch('/api/something')
    .then((response) => format(response))
    .then(({response, json}) => checkStatus(response, json))
    .then(({response, json}) => {
        console.log('Success!', json.message);
    })
    .catch((error) => {
        if (error && error.response) {
            console.log('error message', error.message);
        } else {
            console.log('Unhandled error!');
        }
    });

...结束编辑

promise。所有的都会像这里描述的那样对我起作用:我如何访问以前的promise结果。然后是链条?。然而,我觉得这是不可读的。因此,ES7async功能将起到拯救作用!

async function formatResponse(response) {
    var json = await response.json();
    response.json = json;
    return response;
}

function checkResponseStatus(response) {
    if (response.status >= 200 && response.status < 300) {
        return response;
    } else {
        var error = new Error(response.json.message);
        error.response = response;
        throw error;
    }
}

function handleResponse(response) {
    console.log('success!', response.json);
}

function handleError(error) {
    if (error && error.response) {
        console.log('error message', error.message);
        console.log('error response code', error.response.status)
    } else {
        console.log('Unhandled error!');
    }
}

return fetch('/api/something')
   .then(formatResponse)
   .then(checkResponseStatus)
   .then(handleResponse)
   .catch(handleError);
童宏富
2023-03-14

您只能访问JSON字符串,因为这是您在第一次中从onfully回调返回的内容。然后()。更好的方法是返回promise。all()解析为具有原始响应对象和“已解析”JSON对象的数组的包装器:

return fetch('/api/something')
    .then(response => Promise.all([response, response.json()]))
    .then(([response, json]) => {
        if (response.status < 200 || response.status >= 300) {
            var error = new Error(json.message);
            error.response = response;
            throw error;
        }
        // Either continue "successful" processing:
        console.log('success!', json.message);
        // or return the message to seperate the processing for a followup .then()
        // return json.message;
    })
    .catch(function(ex) {
        console.log('Unhandled Error! ', ex);
    });
 类似资料:
  • 问题内容: 我有一个配置有注释的资源服务器,它通过参数引用授权服务器,如下所示: 授权服务器/用户端点返回其扩展名,例如带有电子邮件: 每当访问某些资源服务器端点时,Spring都会通过调用授权服务器的/user端点来验证幕后的访问令牌,并且实际上会获取丰富的用户信息(其中包含例如电子邮件信息,我已经使用Wireshark进行了验证)。 所以问题是,如何在不显式第二次调用授权服务器端点的情况下获取

  • Appium 的 iOS 版本的后端用的是Facebook's WebDriverAgent。该后端是基于苹果公司的 XCTest 框架,所以也有所有XCTest 框架已知的问题。其中有些问题我们正在设法解决,有一些在现阶段可能无法解决。本文中描述的方法已经能够使您完全掌握在设备上如何构建、管理和运行WDA。通过这种方式,您可以在CI环境中对您的自动化测试进行微调,并使其在长期运行的情况下更加稳定

  • 问题内容: 有什么方法可以使用https://github.com/marmelab/react- admin 软件包执行服务器端表单验证? 这是AdminCreate组件的代码。它将创建请求发送到api。如果一切正常,Api将返回状态为422或状态码200的验证错误。 因此,问题是,如何从服务器发送的错误对象中分别显示每个字段的错误?这是错误对象的示例: 先感谢您! 现在我有以下代码,它显示验证

  • 问题内容: 是否有清除JavaScript 实例的方法? 我已经在QUnit之上编写了一个JavaScript测试框架。该框架通过在.NET中运行每个测试来同步运行测试。(很抱歉,此代码块的长度。我已尽我所能对其进行了评论,因此它不会那么乏味。) 如果测试超时,我的超时Promise将会在测试中进行测试,以便将测试标记为失败,这一切都很好,但是测试继续运行,因为测试Promise()仍在等待解决它

  • 我在spring rest api上工作,我想确保一切都正常工作。我想记录异常行为数据库连接错误等等,我正在使用couchbase数据库,并在endpoint响应中获得例如此类异常:下一条消息:和一个非常长的跟踪。 为此,我在internet上找到了一个解决方案,即扩展ResponseEntityExceptionHandler并重写handleExceptionInternal方法,如下所示:

  • 我在一台Tomcat Web服务器上部署了多个Web应用程序。对于所有已部署的 Web 应用程序,如果任何 Web 应用程序中发生 404 错误,我希望显示相同的 404.jsp 页面。 一种方法是在每个 Web 应用程序的 Web 中放置一个条目 404.xml并为 404.jsp 提供适当的位置。 有没有办法让所有 Web 应用程序在 404 错误上显示 ROOT 的 404 页面? 谢谢,帕