使用 superagent 和 Lumen API 被 CORS 策略阻止的请求

Posted

技术标签:

【中文标题】使用 superagent 和 Lumen API 被 CORS 策略阻止的请求【英文标题】:Request blocked by CORS policy using superagent and a Lumen API 【发布时间】:2020-07-03 01:14:45 【问题描述】:

我使用 php Lumen 框架创建了一个 REST API,我使用以下框架删除了所有 CORS 限制:

// Enable CORS on all API routes
header('Access-Control-Allow-Origin: *');
header("Access-Control-Expose-Headers: Content-Length, X-JSON");
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Authorization, Lang, Content-Type, X-Auth-Token');

然后在前端我使用库superagent 来调用它。例如我调用路由POST http://127.0.0.1:8000/auth/register:

superagent.post('http://127.0.0.1:8000/auth/register').send(
  name: 'name',
  email: 'test@test.test',
  password: '1234Test'
).type('application/json')
  .end((err, res) => 
    console.log(res)
    console.log(err)
  )

很遗憾,我收到一条我无法理解的 CORS 错误消息:

从源“http://localhost:9000”访问位于“http://127.0.0.1:8000/auth/register”的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态。

我做了一些研究,但我找不到任何关于错误 It does not have HTTP ok status 的内容,并且在 Postman 上测试同样的请求没有给我任何错误,而是正常行为。

有人知道我该如何解决吗?在哪里可以找到有关此类错误的一些文档?

【问题讨论】:

OPTIONS 请求未返回 200 OK @M1K1O 哦,谢谢您知道如何解决这个问题吗?是在服务器端吧?这是一般的 PHP 还是来自 Lumen 框架? @johannchopin — 首先查看它得到的响应,然后您就可以开始找出原因。 @Quentin It does not have HTTP ok status 好的,但我从未遇到过这种类型的错误,在 Postman 上我没有收到此错误,而是我的请求的正常行为。我只是想了解它。如何返回200 OK?我真的不知道从哪里开始。 @johannchopin 你确定问题不在那里,但有时在你睡着的时候完成你的代码的奴才会犯一些错误。所以请向我们提供具体代码以及网络+控制台出现错误的屏幕截图。只有知道代码中发生了什么,我们才能提供帮助。 【参考方案1】:

我很好奇为什么您要自己“手动”设置标头,而不是使用一些现有且经过验证的 CORS-Middlwares,它们将为您带来所有魔力。除非您在学习案例中需要它,否则我会避免重新发明***。

这是***上的一个副本:

Enable CORS in lumen

这里是关于 lumen 中间件的官方文档:

https://lumen.laravel.com/docs/7.x/middleware

这里有一些结构良好且知名的中间件可以为您完成这项工作:

https://github.com/fruitcake/laravel-cors https://github.com/spatie/laravel-cors

【讨论】:

哦,哇,谢谢您的研究,我不明白为什么我错过了这个 SO 回复。我验证了您的答案并投票赞成。但是,如果我给你赏金,你会愿意给这个答案***.com/a/49832833/8583669 吗?这取决于您,但我将非常感激您,您将获得Altruist 徽章;) @johannchopin 很公平,很高兴我能提供帮助。我今天正在考虑获得徽章并正在寻找问题。这似乎是它的完美时刻。 顺便问一下:你觉得Peer Pressure 徽章怎么样?由于您的问题是“重复的”,因此在您删除它以获得它之前,我会对其投反对票(对 -3 票投反对票)。一旦我收到赏金,我将代理链接的问题。 好吧,让我们在 18 小时内完成 ;) 我不确定我是否会在 18 小时后上线。无论如何,如果您奖励我或在此处删除您的问题,我已经开始了赏金;)

以上是关于使用 superagent 和 Lumen API 被 CORS 策略阻止的请求的主要内容,如果未能解决你的问题,请参考以下文章

Google Places web api 不与 superagent 合作

SuperAgent使用简介

SuperAgent使用简介

可用于nodejs的SuperAgent(ajax API)

如何将 Laravel 护照用于 Auth 和 Lumen 作为 api

在 laravel/lumen 中使用客户端 ID 和密钥访问 API