【问题标题】:Uncaught (in promise) TypeError: response is undefined using Fetch APIUncaught (in promise) TypeError: response is undefined using Fetch API
【发布时间】:2021-08-17 19:31:46
【问题描述】:

我正在尝试发出 POST 请求并打印响应。我的代码:

async function create_invite(){
    console.log("creating.....")
    const response = await fetch('https://localhost:8080/webhooks', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify(payload)
    }).catch(error => console.log(error))
    console.log(response.json())
}

document.getElementById('create_invite').addEventListener("click", create_invite)

但我得到了这个错误

Uncaught (in promise) TypeError: response is undefined

我尝试在标题中添加 cors 但仍然不起作用

【问题讨论】:

  • 你必须点击返回undefined.catch

标签: javascript api fetch-api


【解决方案1】:

不要将await.then.catch混用,容易混淆。您的await 正在申请来自.catch 的承诺,不是来自fetch 的承诺。看起来fetch 失败了,触发了catch,它将拒绝转换为undefined 的履行。您需要查看fetch 失败的原因,但更新代码仍然很重要。

还有一些其他问题:在调用response.json 之前,请务必检查 HTTP 操作是否成功(fetch 仅在 network 错误时拒绝,而不是 HTTP 错误; API 枪)。此外,您的代码试图直接console.log response.json 的结果,这是一个承诺;取而代之的是await,这样您就可以在读取和解析数据后看到它。

综合起来:

async function create_invite() {
    console.log("creating.....")
    try {
        const response = await fetch('https://localhost:8080/webhooks', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify(payload),
        });
        if (!response.ok) {
            throw new Error(`HTTP error ${response.status}`);
        }
        const data = await response.json();
        console.log(data);
    } catch (error) {
        console.log(error);
    }
}

但是,我强烈建议您不要在那里捕捉错误,除非那是顶级入口点(事件处理程序等)。最好让它们传播给调用者(直到顶级入口点)。

【讨论】:

  • 在 Chrome 中,控制台中会打印任何内容。第一个日志“正在创建.....”显示一秒钟然后消失。
  • 我更改了代码,现在我在尝试获取资源时遇到 TypeError: NetworkError。
  • @Efaz - 这与您的原始问题一致,因为这将转到 catch 并转换为使用 undefined 完成。它告诉您您的浏览器无法访问https://localhost:8080。所以你需要看看为什么会这样。 (例如,您的服务器真的在 8080 端口上运行吗?它真的在做 SSL 吗?证书有问题吗?)
  • 服务器工作正常,POST 请求也正常工作。我可以看到 POST 请求创建的更改,但由于某种原因,我没有得到正确的响应。我尝试了 Postman 并提出了相同的请求,并且成功了。
  • @Efaz - 您查看浏览器控制台/网络选项卡了吗?听起来你正在达到同源政策。 More here.
猜你喜欢
  • 2021-08-18
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
相关资源
最近更新 更多