CORS 标头不适用于 Express 云功能中的特定路由

Posted

技术标签:

【中文标题】CORS 标头不适用于 Express 云功能中的特定路由【英文标题】:CORS header not applied for a particular route in Express cloud functions 【发布时间】:2020-10-20 13:19:26 【问题描述】:

我为云功能实现了一个基本的快速应用程序。我使用了 cors 库来启用 cors。有 4 个 api 端点,所有 4 个都需要预检。出于某种原因,access-control-allow-origin:* 标头放置在 3 条路线上,而不是第 4 条路线上。 准确地说,我正在使用 Content-Type: application/json 进行 POST 请求,这需要进行预检。所有端点都需要相同的标头,但不适用于最后一个。

代码sn-ps:

const express = require("express");
const cors = require("cors");
const bodyParser = require('body-parser');
const admin = require("firebase-admin");
admin.initializeApp();

const app = express();

app.use(cors());

app.use(bodyParser.json());

app.use(express.json());

app.use('/', require('./controllers'));

exports.apiv2 = functions.https.onRequest(app);

路线:

const express = require('express');
const router = express.Router();


router.use('/create-player', require('./createPlayer'));
router.use('/create-game', require('./createGame'));
router.use('/join-game', require('./joinGame'));
router.use('/move', require('./makeMove'));

// 404 error handler for invalid player and game IDs
router.use((err, req, res, next) => 
    res.json( error: err.msg );
);


module.exports = router;

仅对于 /move 路由,cors 请求失败,即使在预检请求通过后也是如此。 Preflight passes with 204。实际请求由于某种原因失败。 The POST request fails

是否有任何特定的访问控制标头不是由 express 仅针对一个端点放置的?

【问题讨论】:

【参考方案1】:

您可以在app.js 中的路由中间件之前设置此中间件来解决这个问题:

// app.js

...

app.use(function (req, res, next) 
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');

  if ('OPTIONS' === req.method)
    res.sendStatus(200);
  else
    next();
);

...

app.use(routes);

然后,这将应用于您的所有路线。

【讨论】:

cors 已在代码中使用。它基本上是一样的。

以上是关于CORS 标头不适用于 Express 云功能中的特定路由的主要内容,如果未能解决你的问题,请参考以下文章

授权标头不适用于 cors [关闭]

启用 CORS 不适用于 Spotify Web API [重复]

xmlHttp.getResponseHeader + 不适用于 CORS

Cors 不适用于 XMLhttprequest 节点/快递

django-cors-headers 不适用于 DRF(Django Rest 框架)

为啥 CORS 似乎不适用于 POST?