即使响应为 200(成功),也会调用 Axios Catch

Posted

技术标签:

【中文标题】即使响应为 200(成功),也会调用 Axios Catch【英文标题】:Axios Catch being called even when response is 200 (Successful) 【发布时间】:2019-05-29 19:30:48 【问题描述】:

我正在使用带有 Axios 的 Electron Vue 应用程序对我的 Laravel 服务器进行 HTTP 调用。在 Electron 的开发模式下,一切都很完美。但是一旦我将我的 Electron 应用程序安装到客户端计算机上,所有的混乱都爆发了。我解决了一些问题,但这个问题会杀了我。

简单地说,即使所有 Axios 都成功返回,它们也会抛出一个错误,我将其放入 .catch() 中。老实说,我很困惑这怎么可能。例如,当我的程序加载时,它会进行一些调用以获取所需的信息。引发错误并显示警报。我想这只是我的 Laravel 服务器。但是数据被成功抓取并添加到应用程序中。

axios.post(`$this.$store.state.URL/get_server_ticket_from_table?api=$this.$store.state.API`, 
    id: this.ServerTicketMove.Server1.id,
    table: this.ServerTicketMove.currentTable
)
.then((response) => 
    console.log(response)

    if (typeof response.data.id != 'undefined') 
        this.ServerTicketMove.ticket = response.data

    

)
.catch(() => 
    alert('Did not get Servers Table Information. Cant Connect to Main Server.')
) 

我做了一些谷歌搜索,看到了一些关于 CORS 的帖子。所以我在我的 Web 服务器和 Laravel 中完成并启用了它。这造成了更大的混乱。同样的错误,但这次没有数据应用于任何内容。所以 .then() 甚至没有被调用。最重要的是,在启用 CORS 的情况下,我的 Axios 似乎正在使用 OPTIONS 的请求方法进行额外的 HTTP 调用。为什么?我认为 CORS 不能解决我的问题。

还在我的 Electron Vue background.js 中,我重新开启了网络安全。由于发展而关闭。这并没有改变任何东西。

win = new BrowserWindow(
    width: 275,
    height: 640,
    title: 'title',
    // webPreferences:  webSecurity: false 
)

有人知道发生了什么吗?

编辑 - 2019 年 1 月 14 日

发现错误“regeneratorRuntime is not defined”后,我认为这是一个 Babel 问题。我已经关注了https://babeljs.io/docs/en/babel-polyfill/ 的所有内容,但我仍然得到“regeneratorRuntime 未定义”。 Babel + Axios + Electron + Await/Sync 一起工作没有错误吗?我个人希望不只是忽略“未定义 regeneratorRuntime”,如果可能的话,为这个问题找到一个可靠的解决方案。任何让我研究的意见或东西都将不胜感激!

【问题讨论】:

如果 CORS 是问题所在,您可以在您的 laravel 应用程序中添加“跨源”标头,或禁用 webSecurity。选项请求是preflight request。它会在启用 webSecurity 时出现 @JacobGoh 再次禁用 WebSecurity 似乎已经停止了额外的 HTTP 调用。摆脱所有 CORS 设置后,我只收到一个 1 HTTP 403 错误。我正在运行 Apache 服务器。即使我仍然成功地从服务器获取信息,关于 403 错误的任何线索?请注意,服务器托管在本地。 好的,所以我已经取得了一些进展,以了解有关我的问题的更多信息。当我进行 Axios 调用并使用 Axios 错误控制台日志时,我发现了这个错误:“regeneratorRuntime 未定义”......并且一些谷歌搜索将我带到babel-polyfill。但是即使它的状态为 200 并成功调用 .then(),仍然会出现上述错误。我应该在 Axios 函数上还是在 Axios 函数中尝试等待?同样考虑到所有这些,这不是 Axios 问题,而只是 Babel 问题吗? 【参考方案1】:

当您的响应有错误时会发生此问题,例如,当响应正确但在 then 响应中您做了一些引发错误的事情时,即使来自服务器的响应成功,axios 也会捕获该错误

p>

【讨论】:

谢谢。这对我有帮助。 据说我不能将此标记为已接受的答案。【参考方案2】:

经过大量谷歌搜索后,我发现我只是在 package.json 中缺少依赖项。即使它们在 node_modules 文件夹中是必需的,但它们并未在我的程序中列为依赖项。

在我的 Electron + Vue + Axios + Sync/Await 的生产版本上工作

npm install --save @babel/runtime 
npm install --save-dev @babel/plugin-transform-runtime

并且,在 .babelrc 中,添加:


    "presets": ["@babel/preset-env"],
    "plugins": [
        ["@babel/transform-runtime"]
    ]

从here的这个答案中得到这个代码

【讨论】:

以上是关于即使响应为 200(成功),也会调用 Axios Catch的主要内容,如果未能解决你的问题,请参考以下文章

跨域请求被阻止,即使它以 200 ok 状态码响应

CORS - 即使在成功的 OPTIONS 响应之后,Firefox 也不会发送 API 调用

即使在从服务器获得响应后,失败函数也会得到回调

Axios Post 200 响应后不返回数据

尽管响应为 200,但 Axios 状态为 449

如何将响应数据包含到 axios 响应中?