Express 应用中请求的资源上不存在 'Access-Control-Allow-Origin' header

No 'Access-Control-Allow-Origin' header is present on the requested resource in Express app

我有一个 Express 应用程序 运行 与我的 Web 应用程序在同一台服务器上。我正在尝试向我的 Express 应用发出 XMLHttpRequest,但出现此错误:

Access to XMLHttpRequest at 'http://10.0.0.222:9999/' from origin 'http://10.0.0.222:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

虽然在我的应用程序中这个 header 显然是 'present'。 应用代码:

var cors = require('cors')
const util = require('util');
var inspect = require('eyes').inspector({maxLength: false})
const express = require('express');
var bodyParser = require('body-parser')
const app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

var corsOptions = {
  origin: 'http://10.0.0.222:8080',
  optionsSuccessStatus: 200, // some legacy browsers (IE11, various SmartTVs) choke on 204
}

app.post('/', cors(corsOptions), function (req, res) {
        console.dir(req.body, {depth: null});
        res.send('a');
});

const PORT = process.env.PORT || 9999;
app.listen(PORT, () => {
  console.log(`Server listening on port ${PORT}...`);
});

XMLHttp请求代码:

var xhr = new XMLHttpRequest();
xhr.open("POST", 'http://10.0.0.222:9999', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(goodJSON)

即使 origin 选项包含我的 Web 应用程序的主机,为什么我仍然会收到此错误?

它不会工作,因为你已经将 headers 放在基本路线中,即 /

解析路由前必须检查headers。在您的情况下,路线已经解决,然后您正在应用 cors headers.

使用这个:

app.use('/', cors(corsOptions));      or     app.use(cors(corsOptions));

app.post('/', function (req, res) {
    console.dir(req.body, {depth: null});
    res.send('a');
});

app.use 中应用 cors 将添加 headers。之后该路径将被解析并且不会抛出错误

错误消息说:

Response to preflight request

preflight 是一个 OPTIONS 请求,请求获得允许才能发出实际请求。

您的处理程序只接受 POST 请求,因此 OPTIONS 请求没有所需的 headers。

文档具体涵盖 preflight requests:

app.options('/', cors(corsOptions));