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

如何从JSON fetch响应捕获错误消息?

卓雅达
2023-03-14

考虑下面的代码

fetch('https://api.flickr.com/services/rest/?method=flickr.photos.search' +
    '&api_key=thiskeyshouldgivemeanerror&text=dog&format=json' +
    '&per_page=24&nojsoncallback=1')
    .then(function(rsp) {
        // Gives "Response {type: "cors", url: "https://api.flickr.com/services/rest/
        // ?method=flick…text=dog&format=json&per_page=24&nojsoncallback=1",
        // redirected: false, status: 200, ok: true, …}"
        console.log(rsp);
        if(rsp.stat !== "ok") {
            throw new Error(rsp.message);
        }
        else {
            return rsp.json();
        }
    })
    .then(function(rsp) {
        // Gives "{stat: "fail", code: 100, message: "Invalid API Key (Key not found)"}"
        // if no error is thrown.
        // Exactly what I want in the first instance!
        console.log(rsp);
    })
    .catch(function(err) {
        alert("Something went wrong. " + err);
    });

我想做的是用我应该从JSON响应中获得的错误消息捕获错误。我希望在我的第二个console.log中得到一个响应,但是不知何故,响应在第一个console.log.我如何在第一个实例中得到我想要的响应?

此外,为什么响应在第一个实例中给我“ok”,即使应用编程接口密钥不存在?

为什么我必须返回rsp.json()才能在第二个实例中获得正确的JSON,而响应应该已经是JSON格式的?

共有1个答案

翁良弼
2023-03-14

第一个then块中的rsp是一个响应对象,而不是后端返回的数据。响应对象没有stat字段,因此其值不能为“ok”。您可能应该检查rsp。正常rsp。状态

检查响应对象引用

在第二个then块中,您可以基于后端返回的JSON数据执行一些检查,然后在需要时抛出一个错误。

fetch(url)
  .then(function(response) {
    if(!response.ok) {
      throw new Error("not ok");
    }
    return response.json()
  })
  .then(function(result) {
    if(result.stat === "fail") {
      throw new Error(result.message);
    }

    // Everything should be ok, process the result here

  })
  .catch(function(err) {
    alert(err);
  });
 类似资料:
  • 问题内容: 我有以下代码: 我想捕获HTML响应?我该怎么做呢?我可以向form1.submit方法注册任何回调函数吗? 问题答案: 使用普通的javascript,您将无法轻松做到这一点。发布表单时,表单输入将发送到服务器,页面会刷新- 数据在服务器端处理。也就是说,该函数实际上不返回任何东西,它只是将表单数据发送到服务器。 如果您真的想用Javascript获得响应(无需刷新页面),则需要使用

  • 我试图拦截来自所有promise然后方法的响应。但是我不能在原型然后方法中得到响应数据。请找到下面的代码。 在上面的代码中,我可以看到控制台打印在所有Promise调用中。但是我无法在then中获得响应对象。 控制台中打印的this对象值: “then”原型方法中的打印参数: 请建议我在then方法中获取所有promise方法的响应对象。 我尝试使用“arguments[0].arguments”

  • 我想检查在页面之间导航时是否收到错误消息。当错误消息出现时,测试将被终止并进行报告。为此,我使用了以下与站点上的错误消息相关的元素。

  • 需要捕获python中HTTP错误的响应主体。当前正在使用python请求模块的raise_for_status()。此方法仅返回状态代码和说明。需要一种方法来捕获响应主体以获取详细的错误日志。 如果在某些不同的模块中存在类似的必需特性,请建议python请求模块的替代方案。如果没有,请建议可以对现有代码进行哪些更改以捕获所述响应主体。 当前实现仅包含以下内容:

  • 这几个月来,我们一直在努力实现这一目标,但现在需要这样做。我需要显示服务器上设置的错误消息,说明出现了什么错误: 服务器endpoint 网状物: 在chrome开发工具中的预览下,我看到消息

  • 我有一个使用axios进行ajax调用的操作,每当axios返回错误时,它就会被axios catch函数捕获,因此我想知道是否有可能将相同的错误抛出到dispatch catch函数。 我尝试//抛出新错误(“内部测试错误”);从axios内部捕获(错误),但dispatch似乎无法捕获错误 vuex存储上的操作代码 关于我在vue组件上的方法 我希望axios抛出catch error,该错误