Express 应用程序中请求的资源上不存在“Access-Control-Allow-Origin”标头

Posted

技术标签:

【中文标题】Express 应用程序中请求的资源上不存在“Access-Control-Allow-Origin”标头【英文标题】:No 'Access-Control-Allow-Origin' header is present on the requested resource in Express app 【发布时间】:2021-08-21 14:04:45 【问题描述】:

我有一个 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.

虽然在我的应用程序中,这个标题显然是“存在的”。 应用代码:

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...`);
);

XMLHttpRequest 代码:

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

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

【问题讨论】:

这是help吗? @ApoorvaChikara 不,仍然出现同样的错误。尝试将 Access-Control-Allow-Origin 设置为我的网络应用程序主机和“*”,但两者都没有区别 根据错误消息,预检请求 (OPTIONS) 中不存在标头,而不是主请求 (POST)。那是因为您在 app.post 调用中添加了中间件,该调用仅对 POST 作出反应,而不对 OPTIONS 作出反应。 This 应该解释一下。 【参考方案1】:

它不起作用,因为您已将标头放置在基本路由中,即/

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

使用这个:

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 将添加标题。之后该路径将被解析并且不会抛出错误

【讨论】:

"它不起作用,因为您已将标头放置在基本路由中,即 /。" — 这是他们向其发出请求的 URL。 是的,我明白了。请编辑您认为合适的答案,因为我的英语不好【参考方案2】:

错误信息说:

对预检请求的响应

preflight 是一个 OPTIONS 请求,用于请求允许发出实际请求。

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

文档具体涵盖preflight requests:

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

【讨论】:

以上是关于Express 应用程序中请求的资源上不存在“Access-Control-Allow-Origin”标头的主要内容,如果未能解决你的问题,请参考以下文章

将大于 1MB 的文件上传到 s3,出现 cors 错误。请求的资源上不存在“Access-Control-Allow-Origin”标头

React JS - 请求的资源上不存在“Access-Control-Allow-Origin”标头。跨域资源错误

Angular 4 - 请求的资源上不存在“Access-Control-Allow-Origin”标头

请求的资源上不存在“Access-Control-Allow-Origin”标头(角度)

angular 9 和 spring boot 2 中请求的资源上不存在“Access-Control-Allow-Origin”标头

获取请求未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头