Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法获取:请求需要预飞行,不允许执行跨原点重定向_Javascript_Ajax_Express_Cors_Fetch Api - Fatal编程技术网

Javascript 无法获取:请求需要预飞行,不允许执行跨原点重定向

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策

我正在使用ExpressforWebServer,并使用客户机的同构获取模块来使用XHR

我的web应用程序有三台服务器:

  • 端口3000->管理网站
  • 端口3001->公共网站
  • 端口3002->API服务器
API服务器具有名为“skills”的资源,其中包含一些数据,并按如下方式获取:

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中间件部分检查此问题。有关如何解决此问题的详细信息,请参阅的答案。另外,正如这里所指出的,规范中不再有对重定向的限制,但浏览器需要更新其实现以匹配规范更改。