将数据作为json从ajax发送到express服务器会导致preflight cors错误



这个问题已经被问了无数次了。我读过mozilla的文档,看了太多的答案,眼睛都疼了。

在我的ajax调用中,我有这样的:

$.ajax({
type: 'POST',
dataType: 'json',
data: {name: "test"},
contentType: 'application/json',
url: 'https://example.com:8443',
success: function (data) {
alert(data);
}

在我的express服务器中,我的server.js文件是这样的:

app.post('/', function (req, res) {
console.log(req.body.myData);
res.header('Access-Control-Allow-Origin: *');
res.header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
res.header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
return res.end('<h1>Hello, Secure World!</h1>');
});

根据我的理解,我正确地使用dataType:'json'和contentType'application/json'进行ajax调用。

此外,我正在将访问控制允许原点设置为*,这应该允许我让任何域访问我的服务器。我不明白我做错了什么。我得到这个错误:

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.

任何帮助都将不胜感激!

我的错误很愚蠢。在express js中,这是不正确的:

res.header('Access-Control-Allow-Origin: *');
res.header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
res.header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');

设置实际上应该是这样的'',''而不是':'

The correct syntax that worked is this:
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT');
res.header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type');

编辑:使用*是一个安全风险,但在这种情况下,它是一台服务器在另一台服务器上测试,这两台服务器都是我自己的。上线时,我会将*设置为example.com

最新更新