Javascript 无法获取:请求需要预飞行,不允许执行跨原点重定向
我正在使用ExpressforWebServer,并使用客户机的同构获取模块来使用XHR 我的web应用程序有三台服务器:Javascript 无法获取:请求需要预飞行,不允许执行跨原点重定向,javascript,ajax,express,cors,fetch-api,Javascript,Ajax,Express,Cors,Fetch Api,我正在使用ExpressforWebServer,并使用客户机的同构获取模块来使用XHR 我的web应用程序有三台服务器: 端口3000->管理网站 端口3001->公共网站 端口3002->API服务器 API服务器具有名为“skills”的资源,其中包含一些数据,并按如下方式获取: GET http://mydomain:3002/skills 它返回JSON数据 但当我从3000/3001请求3002时,它失败,并显示以下消息: 无法加载获取API。从“”到“”的重定向已被CORS策
- 端口3000->管理网站
- 端口3001->公共网站
- 端口3002->API服务器
GET http://mydomain:3002/skills
它返回JSON数据
但当我从3000/3001请求3002时,它失败,并显示以下消息:
无法加载获取API。从“”到“”的重定向已被CORS策略阻止:请求需要预飞,不允许遵循跨源重定向
我不明白为什么会有“重定向”之类的东西。这是我的服务器端代码,我授予了所有与CORS相关的头:
const express = require('express');
const app = express();
...
// CORS
app.use((req, res, next) => {
var allowedOrigins = ['http://example.me', 'http://example.me:3000', 'http://example.me:3001', 'http://example.me:3002'];
var origin = req.headers.origin;
if(allowedOrigins.indexOf(origin) > -1){
res.setHeader('Access-Control-Allow-Origin', origin);
}
res.setHeader('Access-Control-Allow-Credentials', true);
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,Content-Type');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS, HEAD');
if (req.method === "OPTIONS") {
return res.status(200).end();
}
next();
});
app.use(require('./routes'));
...
app.listen(3002, () => console.log(".API Server listening on port 3002..."));
这是使用Fetch API的客户端代码:
fetch('http://example.com:3002/skills', {
method: 'GET',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
credentials: 'include',
cache: 'no-store',
mode: 'cors'
})...
正如您所看到的,没有重定向代码。我花了几乎一天的时间来解决这个问题,但我尝试的一切都失败了,我发现的每一个信息都是无用的
我认为将服务拆分为API服务器和Web服务器(实际上返回HTML)是一个好主意,我希望采用这种方法
有办法解决这个问题吗?任何建议都将不胜感激。我几年前就解决了这个问题,但仍然不明白为什么会发生
然而我的解决方案很简单,将每个API放入/API路径。我几年前解决了这个问题,仍然不明白为什么会发生
然而,我的解决方案很简单,将每个API放入/API路径。为什么要在GET请求上设置内容类型?是否允许在3台服务器上使用Cors?@Quentin我不记得实际原因,我想我只是在某个地方看到了一些获取API信息。我刚刚删除了标题。不管怎样,那没关系,还是不行。@Hosar是的,当然。我允许他们中的三个。您可以在服务器端代码cors中间件部分检查此问题。有关如何解决此问题的详细信息,请参阅的答案。此外,正如这里所指出的,规范中不再有对重定向的限制,但浏览器需要更新其实现以匹配规范更改。为什么要在GET请求上设置内容类型?是否允许在3台服务器上使用Cors?@Quentin我不记得为什么,我想我只是在某个地方看到了一些获取API的信息。我刚刚删除了标题。不管怎样,那没关系,还是不行。@Hosar是的,当然。我允许他们中的三个。您可以在服务器端代码cors中间件部分检查此问题。有关如何解决此问题的详细信息,请参阅的答案。另外,正如这里所指出的,规范中不再有对重定向的限制,但浏览器需要更新其实现以匹配规范更改。