【问题标题】:CORS "It does not have HTTP ok status."CORS “它没有 HTTP ok 状态。”
【发布时间】:2020-03-12 17:58:51
【问题描述】:

NodeJS Express 平台。立即使用 Zeit 2. 不能使用 server.js 作为代理从后端发送以防止 CORS。所以,也不是与 CORS 问题搏斗。测试桌面:chrome、safari、firefox。手机:chrome、firefox。已测试使用 HTTPS 在 Now 上托管,与我在 localhost:3000127.0.0.1:3000 本地得到的错误相同,使用端口 80 相同。

Access to fetch at 'https://**MY_URL**/user/login' from origin 'http://127.0.0.1:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

我使用 https://www.npmjs.com/package/cors 设置我的 CORS 配置:

app.use(cors({
  'allowedHeaders': ['Content-Type', 'API-Key', 'API-Secret', 'Access-Control-Allow-Headers'', 'accept', 'client-security-token'],
  'exposedHeaders': ['sessionId'],
  'origin': '*',
  'methods': 'GET, HEAD, PUT, PATCH, POST, DELETE, OPTIONS',
  'preflightContinue': false,
  'credentials': true
}));

CORS 设置似乎对我不起作用,所以我尝试使用 now.json 文件,如下所示(修剪过的版本):

{
  "name": "my-test-api",
  "version": 2,
  "routes": [
    {
     "src": "/.*",
     "methods": ["GET", "POST", "OPTIONS"],
     "headers": { "Access-Control-Max-Age": "1000", "Access-Control-Allow-Methods": "GET, HEAD, PUT, PATCH, POST, DELETE, OPTIONS", "Access-Control-Allow-Origin": "*", "Accept": "text/plain", "Content-Type": "text/plain", "Access-Control-Allow-Headers": "sessionId, Content-Type, API-Key, API-Secret, Access-Control-Allow-Headers", "Access-Control-Expose-Headers": "sessionId", "Access-Control-Allow-Credentials": "true" },
     "continue": true
    },
    { "src": "/user/login", "methods": ["POST"], "dest": "index.js" }
  ]
}

甚至在我的所有回复中都添加了 statusCode 200,但没有任何成功。删除 Npm-cors-package 不会改变任何东西,但删除 Now.json 会完全破坏东西,即使我在 app.use(cors()) 中指定了它,我也会得到 this error, from MDN

真的不知道该怎么做,一直在为此苦苦挣扎。我可以使用后端代理的 cURL 或其他主机没有问题。

【问题讨论】:

  • 'allowedHeaders': ['Content-Type', 'API-Key', 'API-Secret', 'Access-Control-Allow-Headers'', 'accept', 'client-security-token'] 中的引用不平衡。这是问题所在,还是只是您的问题中的错字?如果是后者,这让我想知道您的问题在多大程度上代表了您的实际配置。
  • 您不能将来源设置为通配符并包含凭据!请参阅developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/…
  • 你用 Postman 测试过吗?

标签: node.js express


【解决方案1】:

您可能需要为您的路线启用飞行前请求

app.use(cors())

app.options('/post/login', cors()) // enable pre-flight requests
app.post('/post/login', (req, res, next) => {
    // your code here
});

或所有路线

app.options('*', cors())

【讨论】:

  • 来自 chrome:“已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。”
  • 我在 firefoz 中得到了这个:developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/… 即使我在 cors( )
【解决方案2】:

您可以设置飞行前响应的 HTTP 状态。

app.options('*', function (req,res) { res.sendStatus(200); });

【讨论】:

    【解决方案3】:

    当预检 (OPTIONS) 请求返回 404 时,我收到了这个神秘错误。我最终发现我使用的路径不正确,而我的路由器 (Golang httprouter) 404s OPTIONS 不存在的路由。

    【讨论】:

      【解决方案4】:

      您可以使用 nginx 的反向代理将您的 80 端口的请求代理到 3000 端口,它会正常工作

      【讨论】:

        【解决方案5】:

        请尝试添加一行并从 express 和 now.json 中删除旧的 cors 配置

        app.use(cors());

        就是这样。现在启用了 CORS。 如果您向您的应用发出请求,您会注意到一个新的标头被返回: Access-Control-Allow-Origin: *

        【讨论】:

          【解决方案6】:

          https://cors-anywhere.herokuapp.com/yoururl

          例子:

          axios.get('https://cors-anywhere.herokuapp.com/spo.handball4all.de/Spielbetrieb/index.php?orgGrpID=56&score=45991')
              .then(response => {
                const $ = cheerio.load(response.data);
          })
          

          【讨论】:

            猜你喜欢
            • 2021-08-06
            • 2021-07-03
            • 2021-08-11
            • 2019-08-21
            • 1970-01-01
            • 2020-01-14
            • 2019-04-03
            • 2021-04-26
            • 2019-02-10
            相关资源
            最近更新 更多