为什么将 CORS 标头添加到 OPTIONS 路由不允许浏览器访问我的 API?

Why doesn't adding CORS headers to an OPTIONS route allow browsers to access my API?

提问人:mikong 提问时间:8/16/2011 最后编辑:Quentinmikong 更新时间:10/30/2023 访问量:872824

问:

我正在尝试在使用 Express.js Web 框架的 Node.js 应用程序中支持 CORS。我读过一个关于如何处理这个问题的 Google 小组讨论,并阅读了几篇关于 CORS 如何工作的文章。首先,我这样做了(代码是用 CoffeeScript 语法编写的):

app.options "*", (req, res) ->
  res.header 'Access-Control-Allow-Origin', '*'
  res.header 'Access-Control-Allow-Credentials', true
  # try: 'POST, GET, PUT, DELETE, OPTIONS'
  res.header 'Access-Control-Allow-Methods', 'GET, OPTIONS'
  # try: 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'
  res.header 'Access-Control-Allow-Headers', 'Content-Type'
  # ...

它似乎不起作用。我的浏览器 (Chrome) 似乎没有发送初始 OPTIONS 请求。当我刚刚更新资源的块时,我需要向以下对象提交跨域 GET 请求:

app.get "/somethingelse", (req, res) ->
  # ...
  res.header 'Access-Control-Allow-Origin', '*'
  res.header 'Access-Control-Allow-Credentials', true
  res.header 'Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS'
  res.header 'Access-Control-Allow-Headers', 'Content-Type'
  # ...

它有效(在 Chrome 中)。这也适用于 Safari。

我读过...

在实现 CORS 的浏览器中,每个跨域 GET 或 POST 请求之前都有一个 OPTIONS 请求,用于检查 GET 或 POST 是否正常。

所以我的主要问题是,为什么在我的情况下似乎没有发生这种情况?为什么我的 app.options 块没有被调用?为什么我需要在我的主 app.get 块中设置标头?

节点.js Express coffeescript cors

评论

0赞 AmirReza-Farahlagha 9/23/2019
这个答案可能有用:stackoverflow.com/a/58064366/7059557
0赞 Hyzyr 1/12/2022
您是否在所有路由之前声明了 app.options('*', cors());

答:

475赞 evilcelery 8/16/2011 #1

尝试将控制权传递给下一个匹配的路由。如果 Express 首先匹配 app.get 路由,则除非您这样做,否则它不会继续进入选项路由(注意使用 next):

app.get('somethingelse', (req, res, next) => {
  //..set headers etc.
        
  next();
});

在组织 CORS 内容方面,我把它放在一个对我来说效果很好的中间件中:

// CORS middleware
const allowCrossDomain = (req, res, next) => {
  res.header(`Access-Control-Allow-Origin`, `example.com`);
  res.header(`Access-Control-Allow-Methods`, `GET,PUT,POST,DELETE`);
  res.header(`Access-Control-Allow-Headers`, `Content-Type`);
  next();
};

//...

app.configure(() => {
  app.use(express.bodyParser());
  app.use(express.cookieParser());
  app.use(express.session({ secret: `cool beans` }));
  app.use(express.methodOverride());
  // CORS middleware
  app.use(allowCrossDomain);
  app.use(app.router);
  app.use(express.static(`public`));
});

评论

1赞 Nick 9/13/2011
我相信 OPTIONS 发生在 GET 之前,而如果您正在执行 POST - 则没有 OPTIONS 请求......
22赞 pixelfreak 11/17/2012
是逗号分隔的字符串还是数组?config.allowedDomains
2赞 mcfedr 3/20/2013
config.allowedDomains 应该是一个空格分隔的数组
1赞 Xerri 9/19/2013
通过简单地重新排列快速中间件顺序,删除了额外的会话。另一方面,这需要更多的安全性。如果源不在允许的域中,则请求仍会被处理,只有浏览器无法看到它,并且源可能会被欺骗。我的建议是进行检查,如果来源不在允许列表中,则立即返回 403。此外,如果正在提供任何敏感信息,请通过会话验证用户。
1赞 tkit 3/27/2014
@mcfedr 你能解释一下空格分隔数组是什么意思吗?
221赞 Dobes Vandermeer 12/20/2011 #2

为了回答您的主要问题,如果 POST 或 GET 中包含任何非简单的内容或标头,则 CORS 规范仅要求在 POST 或 GET 之前进行 OPTIONS 调用。

需要 CORS 预检请求(OPTIONS 调用)的 Content-Type 是除以下类型之外的任何 Content-Type:

  1. application/x-www-form-urlencoded
  2. multipart/form-data
  3. text/plain

除上面列出的内容类型外,任何其他内容类型都将触发预检请求。

对于 Headers,除以下情况外,任何 Request Header 都将触发预检请求:

  1. Accept
  2. Accept-Language
  3. Content-Language
  4. Content-Type
  5. DPR
  6. Save-Data
  7. Viewport-Width
  8. Width

任何其他请求标头都将触发预检请求。

因此,您可以添加一个自定义标头,例如: ,这应该会触发预检请求并命中 OPTIONS 块。x-Trigger: CORS

请参阅 MDN Web API 参考 - CORS 预检请求

评论

35赞 Glen Pierce 4/30/2018
你能举个例子吗?
3赞 Dobes Vandermeer 5/1/2018
我链接到的页面似乎有很多例子。你能告诉我你认为缺少什么例子吗?
10赞 dwanderson 6/19/2018
不过,一般来说,仅链接的答案是脆弱的,因为它们随时可能被破坏。也就是说,这个答案似乎足够好,因为它突出了块不发送的一般条件。如果它有接受的列表,或者哪些需要,等等,那就太好了,但这是一个好的开始OPTIONSHEADERScontent-typesOPTIONS
0赞 aderchox 4/25/2022
很好的答案谢谢,但是添加一个自定义的 x-Trigger 标头只是为了触发飞行前对我来说听起来很奇怪,这只是为了“教育”目的而建议的,还是它实际上有用?
134赞 Lialon 2/24/2012 #3

保持相同的路由理念。我使用这段代码:

app.all('/*', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
});

http://enable-cors.org/server_expressjs.html 示例相似

评论

1赞 Oliver Dixon 1/2/2015
这进入了 grunt.js 文件?
7赞 backdesk 2/4/2015
飞行前呢?
0赞 Alexandre Magno Teles Zimerer 7/5/2019
没有@OliverDixon,这是在服务器端
64赞 mcfedr 10/31/2012 #4

我做了一个更完整的中间件,适合express或connect。它支持印前检查请求。请注意,它将允许 CORS 访问任何内容,如果您想限制访问,您可能需要进行一些检查。OPTIONS

app.use(function(req, res, next) {
    var oneof = false;
    if(req.headers.origin) {
        res.header('Access-Control-Allow-Origin', req.headers.origin);
        oneof = true;
    }
    if(req.headers['access-control-request-method']) {
        res.header('Access-Control-Allow-Methods', req.headers['access-control-request-method']);
        oneof = true;
    }
    if(req.headers['access-control-request-headers']) {
        res.header('Access-Control-Allow-Headers', req.headers['access-control-request-headers']);
        oneof = true;
    }
    if(oneof) {
        res.header('Access-Control-Max-Age', 60 * 60 * 24 * 365);
    }

    // intercept OPTIONS method
    if (oneof && req.method == 'OPTIONS') {
        res.send(200);
    }
    else {
        next();
    }
});

评论

0赞 Leonidas 3/20/2013
嘿,我遇到了您的解决方案,并想知道如果未检测到其中一个标头,是否应该将“其中一个”标志设置为 false?
1赞 mcfedr 3/20/2013
某些请求不会包含所有标头。具体来说,浏览器将发送一个 GET 请求,当它没有得到正确的 allow-origin 响应时,会给 js 一个错误。而对于 POST 请求,首先发送带有 allow-method 标头的 OPTIONS 请求,然后才发送实际的 POST 请求。
1赞 Leonidas 3/20/2013
啊,我明白了。谢谢。如果 req 方法是“options”,您是否曾经因为不将 res.send(200) 放在那里而遇到麻烦?
0赞 mcfedr 3/20/2013
我不认为我尝试过发送其他东西,我想任何其他响应都会导致浏览器拒绝它正在预检的请求。
0赞 Sebastien H. 4/11/2018
像魅力一样工作,我只会添加一个授权域列表以提高安全性
727赞 Wayne Maurer 2/7/2014 #5

我发现最简单的方法是使用 node.js 包 cors。最简单的用法是:

var cors = require('cors')

var app = express()
app.use(cors())

当然,有很多方法可以根据您的需要配置行为;上面链接的页面显示了许多示例。

评论

2赞 Sambhav Sharma 6/28/2014
当我将它与凭据一起使用时,它对我来说失败了。:(其他一切都像魅力一样。但是,如果它失败,将Credentials设置为true,它对我没有用
0赞 Akash Patra 8/20/2014
它对ajax请求工作正常。我想要脚本标记和 iFrame 的 CORS 实现,因为在这些请求中,请求标头中不存在 Origin :(如何实现这一点?
97赞 nlawson 11/4/2014
您还需要设置cors({credentials: true, origin: true})
6赞 chovy 12/19/2018
如何在此处启用预检选项?
1赞 jub0bs 11/23/2021
@nlawson 永远不要使用!这相当于使同源策略无效。非常不安全。cors({credentials: true, origin: true})
4赞 Pat 5/6/2014 #6

我对Express 4.2.0最简单的解决方案(编辑:似乎在4.3.0中不起作用)是:

function supportCrossOriginScript(req, res, next) {
    res.status(200);
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Content-Type");

    // res.header("Access-Control-Allow-Headers", "Origin");
    // res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    // res.header("Access-Control-Allow-Methods","POST, OPTIONS");
    // res.header("Access-Control-Allow-Methods","POST, GET, OPTIONS, DELETE, PUT, HEAD");
    // res.header("Access-Control-Max-Age","1728000");
    next();
}

// Support CORS
app.options('/result', supportCrossOriginScript);

app.post('/result', supportCrossOriginScript, function(req, res) {
    res.send('received');
    // do stuff with req
});

我想这样做也会起作用......app.all('/result', ...)

23赞 Daniel Laurindo 11/9/2014 #7

测试是在不同的端口中运行的 express + node + ionic 完成的。

Localhost:8100

Localhost:5000

// CORS (Cross-Origin Resource Sharing) headers to support Cross-site HTTP requests

app.all('*', function(req, res, next) {
       res.header("Access-Control-Allow-Origin", "*");
       res.header("Access-Control-Allow-Headers", "X-Requested-With");
       res.header('Access-Control-Allow-Headers', 'Content-Type');
       next();
});

评论

5赞 Shefalee Chaudhary 12/15/2016
我们需要在哪个文件中添加此行?
11赞 Kiko Seijo 8/25/2015 #8

这对我有用,因为它在路由中很容易实现,我使用 meanjs 并且它工作正常,safari、chrome 等。

app.route('/footer-contact-form').post(emailer.sendFooterMail).options(function(req,res,next){ 
        res.header('Access-Control-Allow-Origin', '*'); 
        res.header('Access-Control-Allow-Methods', 'GET, POST');
        res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
        return res.send(200);

    });
43赞 Russ 1/3/2016 #9

执行以下操作:

app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
});
1赞 melvinv 2/10/2016 #10

我发现使用 npm 请求包 (https://www.npmjs.com/package/request 来做到这一点非常容易)

然后我根据这篇文章 http://blog.javascripting.com/2015/01/17/dont-hassle-with-cors/

'use strict'

const express = require('express');
const request = require('request');

let proxyConfig = {
    url : {
        base: 'http://servertoreach.com?id=',
    }
}

/* setting up and configuring node express server for the application */
let server = express();
server.set('port', 3000);


/* methods forwarded to the servertoreach proxy  */
server.use('/somethingElse', function(req, res)
{
    let url = proxyConfig.url.base + req.query.id;
    req.pipe(request(url)).pipe(res);
});


/* start the server */
server.listen(server.get('port'), function() {
    console.log('express server with a proxy listening on port ' + server.get('port'));
});
0赞 Bernardo Ramos 5/15/2016 #11

我们可以避免 CORS 并将请求转发到其他服务器:

// config:
var public_folder = __dirname + '/public'
var apiServerHost = 'http://other.server'

// code:
console.log("starting server...");

var express = require('express');
var app = express();
var request = require('request');

// serve static files
app.use(express.static(public_folder));

// if not found, serve from another server
app.use(function(req, res) {
    var url = apiServerHost + req.url;
    req.pipe(request(url)).pipe(res);
});

app.listen(80, function(){
    console.log("server ready");
});

评论

1赞 david.barkhuizen 1/16/2018
这并不能回答提出的问题
40赞 rahuL islam 6/16/2016 #12

安装 ExpressJS 的 CORS 模块。您可以按照以下步骤操作>

安装

npm install cors

简单用法(启用所有 CORS 请求)

var express = require('express');
var cors = require('cors');
var app = express();
app.use(cors());

有关更多详细信息,请访问 https://github.com/expressjs/cors

评论

2赞 Oliver Dixon 12/4/2017
TypeError: Cannot read property 'headers' of undefined最基本的应用程序设置。
1赞 codebased 4/13/2018
你确定你有请求对象吗?:)
100赞 Yatender Singh 7/21/2016 #13

npm install cors --save

只需将这些行添加到您的请求所在的主文件中(将其保留在任何路由之前)。

const cors = require('cors');
const express = require('express');
let app = express();
app.use(cors());
app.options('*', cors());

评论

3赞 Rajeshwar 11/12/2018
app.options('*', cors())包含在其他路由之前
12赞 Shubham Verma 1/24/2017 #14

前段时间,我遇到了这个问题,所以我这样做是为了在我的 nodejs 应用程序中允许 CORS:

首先,您需要使用以下命令进行安装cors

npm install cors --save

现在,将以下代码添加到应用启动文件中,例如 (app.js or server.js)

var express = require('express');
var app = express();

var cors = require('cors');
var bodyParser = require('body-parser');

//enables cors
app.use(cors({
  'allowedHeaders': ['sessionId', 'Content-Type'],
  'exposedHeaders': ['sessionId'],
  'origin': '*',
  'methods': 'GET,HEAD,PUT,PATCH,POST,DELETE',
  'preflightContinue': false
}));

require('./router/index')(app);

评论

0赞 colin rickels 7/6/2018
安装 CORS 后尝试了这个。Cors 不是一个函数
22赞 Reneesh TK 9/5/2017 #15

首先,只需在项目中安装 CORS。 将终端(命令提示符)带到您的项目目录并运行以下命令:cd

npm install cors --save

然后获取服务器.js文件并更改代码以在其中添加以下内容:

var cors = require('cors');


var app = express();

app.use(cors());

app.use(function(req, res, next) {
   res.header("Access-Control-Allow-Origin", "*");
   res.header('Access-Control-Allow-Methods', 'DELETE, PUT, GET, POST');
   res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
   next();
});

这对我有用..

评论

8赞 thisissami 9/8/2017
如果你正在做这些事情,你就不需要了。 是一个为您处理所有这些的库。删除你的第一行和第三行(又名所有 with),你会发现它仍然有效。corsres.headercorscors
0赞 thisissami 9/8/2017
哎呀,我很确定你真正需要的就是这条线res.header("Access-Control-Allow-Origin", "*");
0赞 thisissami 9/8/2017
但请记住,这样做会损害您的安全。:)
10赞 Koray Gocmen 1/6/2018 #16

如果要使其特定于控制器,可以使用:

res.setHeader("X-Frame-Options", "ALLOWALL");
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Methods", "POST, GET");
res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");

请注意,这也将允许 iframe。

0赞 Ângelo Polotto 6/14/2018 #17

我对我的 Web 应用程序使用了以下步骤,并取得了成功:

将 cors 包添加到 express:

npm install cors --save

在 bodyParser 配置后添加以下行。我在 bodyParser 之前添加时遇到了一些麻烦:

 // enable cors to the server
const corsOpt = {
    origin: process.env.CORS_ALLOW_ORIGIN || '*', // this work well to configure origin url in the server
    methods: ['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS'], // to works well with web app, OPTIONS is required
    allowedHeaders: ['Content-Type', 'Authorization'] // allow json and token in the headers
};
app.use(cors(corsOpt)); // cors for all the routes of the application
app.options('*', cors(corsOpt)); // automatic cors gen for HTTP verbs in all routes, This can be redundant but I kept to be sure that will always work.
2赞 overcomer 7/9/2018 #18

在打字稿中,如果要使用 node.js 包 cors

/**
* app.ts
* If you use the cors library
*/

import * as express from "express";
[...]
import * as cors from 'cors';

class App {
   public express: express.Application;

   constructor() {
       this.express = express();
       [..]
       this.handleCORSErrors();
   }

   private handleCORSErrors(): any {
       const corsOptions: cors.CorsOptions = {
           origin: 'http://example.com',
           optionsSuccessStatus: 200
       };
       this.express.use(cors(corsOptions));
   }
}

export default new App().express;

如果不想使用第三方库进行 cors 错误处理,则需要更改 handleCORSErrors() 方法。

/**
* app.ts
* If you do not use the cors library
*/

import * as express from "express";
[...]

class App {
   public express: express.Application;

   constructor() {
       this.express = express();
       [..]
       this.handleCORSErrors();
   }

   private handleCORSErrors(): any {
       this.express.use((req, res, next) => {
           res.header("Access-Control-Allow-Origin", "*");
           res.header(
               "Access-Control-ALlow-Headers",
               "Origin, X-Requested-With, Content-Type, Accept, Authorization"
           );
           if (req.method === "OPTIONS") {
               res.header(
                   "Access-Control-Allow-Methods",
                   "PUT, POST, PATCH, GET, DELETE"
               );
               return res.status(200).json({});
           } 
           next(); // send the request to the next middleware
       });
    }
}

export default new App().express;

用于使用 app.ts 文件

/**
* server.ts
*/
import * as http from "http";
import app from "./app";

const server: http.Server = http.createServer(app);

const PORT: any = process.env.PORT || 3000;
server.listen(PORT);

评论

1赞 Quentin 7/9/2018
“如果服务器是用打字稿编写的”——不是。问题说它是用 CoffeeScript 编写的。
3赞 overcomer 7/9/2018
@Quentin我只是想在typesript中展示一个替代方案,希望这可以帮助某人。
2赞 Ishan Patel 8/30/2018 #19

使用 Express Middleware 对我来说效果很好。如果您已经在使用 Express,只需添加以下中间件规则即可。它应该开始工作。

app.all("/api/*", function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With");
  res.header("Access-Control-Allow-Methods", "GET, PUT, POST");
  return next();
});

app.all("/api/*", function(req, res, next) {
  if (req.method.toLowerCase() !== "options") {
    return next();
  }
  return res.send(204);
});

参考

6赞 Gadhia Reema 9/25/2018 #20

可以参考下面的代码。资料来源: Academind/node-restful-api

const express = require('express');
const app = express();

//acts as a middleware
//to handle CORS Errors
app.use((req, res, next) => { //doesn't send response just adjusts it
    res.header("Access-Control-Allow-Origin", "*") //* to give access to any origin
    res.header(
        "Access-Control-Allow-Headers",
        "Origin, X-Requested-With, Content-Type, Accept, Authorization" //to give access to all the headers provided
    );
    if(req.method === 'OPTIONS'){
        res.header('Access-Control-Allow-Methods', 'PUT, POST, PATCH, DELETE, GET'); //to give access to all the methods provided
        return res.status(200).json({});
    }
    next(); //so that other routes can take over
})

评论

0赞 rfcabal 1/13/2019
我看到了很多答案,这有一些很重要的东西,我尝试在一些其他配置后使用这部分代码,但它不起作用,出于某种原因,我尝试将代码放在应用程序之后并起作用!我认为提及它很重要。const app = express();
-1赞 arupjbasu 10/2/2018 #21

下面的代码将起作用,但首先通过以下方式安装 cors:

npm install --save cors

然后:

module.exports = function(app) { 
var express = require("express");
var cors = require('cors');
var router = express.Router();
app.use(cors());

app.post("/movies",cors(), function(req, res) { 
res.send("test");
});
1赞 Swoot 1/17/2019 #22

这类似于 Pat 的答案,不同之处在于我以 res.sendStatus(200) 结束;而不是 next();

该代码将捕获方法类型 OPTIONS 的所有请求,并发回 access-control-headers。

app.options('/*', (req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
    res.sendStatus(200);
});

该代码按照问题中的请求接受来自所有源的 CORS。但是,最好将 * 替换为特定来源,即 http://localhost:8080 以防止误用。

由于我们使用 app.options-method 而不是 app.use-method,因此我们不需要进行以下检查:

req.method === 'OPTIONS'

我们可以在其他一些答案中看到这一点。

我在这里找到了答案:http://johnzhang.io/options-request-in-express

-1赞 Johnathan Enslin 3/2/2019 #23

使用没有快速/外部库的 nodejs,我在服务器.js文件中使用了以下方法。这里的关键部分是从请求标头中获取源,然后在服务器响应中允许它,此时我们可以设置将返回的标头,包括如果找到匹配项,则允许的源。

    **const origin = req.headers.origin;**

      let decoder = new StringDecoder('utf-8');
      let buffer = '';
      req.on('data', function (data) {
        buffer += decoder.write(data);
      });
      req.on('end', function () {
        buffer += decoder.end();

        let chosenHandler = typeof (server.router[trimmedPath]) !== 'undefined' ? server.router[trimmedPath] : handlers.notFound;

const data = { ....data object vars}

// should be wrapped in try catch block
      chosenHandler(data, function (statusCode, payload, contentType) {
        server.processHandlerResponse(res, method, trimmedPath, statusCode, payload, contentType, **origin**);


server.processHandlerResponse = function (res, method, trimmedPath, statusCode, payload, contentType, origin) {
  contentType = typeof (contentType) == 'string' ? contentType : 'json';

  statusCode = typeof (statusCode) == 'number' ? statusCode : 200;

  let payloadString = '';
  if (contentType == 'json') {
    res.setHeader('Content-Type', 'application/json');

    const allowedOrigins = ['https://www.domain1.com', 'https://someotherdomain','https://yetanotherdomain',
    ...// as many as you need
  ];
    **if (allowedOrigins.indexOf(origin) > -1) {
        res.setHeader('Access-Control-Allow-Origin', origin);
    }**
    payload = typeof (payload) == 'object' ? payload : {};
    payloadString = JSON.stringify(payload);
  }

... //  if (other content type) ...rinse and repeat..
4赞 Vatsal Shah 3/15/2019 #24

下面对我有用,希望它对某人有所帮助!

const express = require('express');
const cors = require('cors');
let app = express();

app.use(cors({ origin: true }));

https://expressjs.com/en/resources/middleware/cors.html#configuring-cors 那里得到了参考

评论

0赞 Andrew Koper 3/19/2019
它进入什么文件?花生酱.js?
0赞 Vatsal Shah 3/19/2019
不确定花生酱.js,对我来说是Express.js。基本上,它应该是您需要 Express 应用程序、初始化它和需要路由文件的文件。
1赞 Harshit Agarwal 4/20/2019 #25

最简单的方法是使用以下方法在项目中安装 cors 模块:

npm i --save cors

然后,在服务器文件中,使用以下命令导入它:

import cors from 'cors';

然后简单地将它用作中间件,如下所示:

app.use(cors());

希望这有帮助!

8赞 Balaj Khan 6/17/2019 #26

在我的中,我补充道:index.js

app.use((req, res, next) => {
   res.header("Access-Control-Allow-Origin", "*");
   res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
   res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
   next();
}) 

评论

2赞 Eksapsy 8/19/2019
我应该评论一下,这意味着您将无法将 Cookie 发送到服务器,它们将被 CORS 政策拒绝 - 来源:developer.mozilla.org/en-US/docs/Web/HTTP/... .因此,如果您想使用 cookie,请不要使用它。Access-Control-Allow-Origin = *
0赞 CDM social medias in bio 8/18/2019 #27

如果我是你@OP我会改变我的编程范式。

假设您因为向 localhost 或类似内容发出请求而被阻止这些 CORS。

最终,如果您要部署到生产中的光电,例如 or 或 ,则不必担心 CORS,例如允许源或生产中的其他内容。Google Cloud PlatformHeroku

因此,在测试服务器时,只需使用,您就不会被 CORS 阻止,然后部署您的服务器,然后在您的客户端上工作。postman

0赞 Ankit Kumar Rajpoot 9/6/2019 #28

你可以使用 Express 中间件,阻止你的域名和方法。

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", process.env.DOMAIN); // update to match the domain you will make the request from
  res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE");
  res.header(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept"
  );
  next();
});
6赞 vkarpov15 11/15/2019 #29

最简单的答案是只使用 cors 包

const cors = require('cors');

const app = require('express')();
app.use(cors());

这将全面启用 CORS。如果你想学习如何在没有外部模块的情况下启用CORS,你真正需要的只是一些设置“Access-Control-Allow-Origin”标头Express中间件。这是允许从浏览器到服务器的交叉请求域所需的最低要求。

app.options('*', (req, res) => {
  res.set('Access-Control-Allow-Origin', '*');
  res.send('ok');
});

app.use((req, res) => {
  res.set('Access-Control-Allow-Origin', '*');
});
-3赞 mila kohen 2/1/2020 #30

/*首先,这可能是像我这样的初级开发人员的问题:确保在获取方法中使用“lambda”>>>>“'”而不是“'”!*/

''' const response = await fetch(https://api....);

/另外,强烈推荐以下文章: https://developer.edamam.com/api/faq/

1赞 Rashid Iqbal 3/3/2020 #31

简单就是困难:

 let my_data = []
const promise = new Promise(async function (resolve, reject) {
    axios.post('https://cors-anywhere.herokuapp.com/https://maps.googleapis.com/maps/api/directions/json?origin=33.69057660000001,72.9782724&destination=33.691478,%2072.978594&key=AIzaSyApzbs5QDJOnEObdSBN_Cmln5ZWxx323vA'
        , { 'Origin': 'https://localhost:3000' })
        .then(function (response) {
            console.log(`axios response ${response.data}`)
            const my_data = response.data
            resolve(my_data)
        })
        .catch(function (error) {
            console.log(error)
            alert('connection error')
        })
})
promise.then(data => {
    console.log(JSON.stringify(data))
})
3赞 Enzo Barrera 4/11/2020 #32

在主 js 文件中试试这个:

app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
res.header(
  "Access-Control-Allow-Headers",
  "Authorization, X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Allow-Request-Method"
);
res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE");
res.header("Allow", "GET, POST, OPTIONS, PUT, DELETE");
next();
});

这应该可以解决您的问题

3赞 ofir_aghai 10/26/2020 #33

使用包。并输入以下参数:CORS

cors({credentials: true, origin: true, exposedHeaders: '*'})

评论

2赞 Hemanth Kollipara 5/25/2021
我希望允许我的标题在响应标题中可见的确切答案auth-token
3赞 nydame 4/11/2021 #34

如果你想让 CORS 在没有 cors NPM 包的情况下工作(为了纯粹的学习乐趣!),你绝对可以自己处理 OPTIONS 调用。以下是对我有用的东西:

app.options('*', (req, res) => {
    res.writeHead(200, '', {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'OPTIONS',
    }).end();
});

很好,很简单,对吧?请注意使用 res.writeHead() 而不是我不熟悉的 res.header()。

8赞 Milad ranjbar 6/20/2021 #35

cors软件包是解决 express.js 中 CORS 策略问题的推荐方法,但您还需要确保也启用它,如下所示:app.options

const cors = require('cors');

// enable cors
app.use(
  cors({
    origin: true,
    optionsSuccessStatus: 200,
    credentials: true,
  })
);
app.options(
  '*',
  cors({
    origin: true,
    optionsSuccessStatus: 200,
    credentials: true,
  })
);
1赞 DevLoverUmar 12/22/2021 #36

如果您的 Express Server 启用了授权,您可以像这样实现

const express = require('express');
const app=express();
const cors=require("cors");
app.use(cors({
   credentials: true, // for authorization
}));
...
0赞 Timelot 10/30/2023 #37

2023 年,随着 reactstrap “npm run start” 在 3000 和 nodejs express 服务器在 3001 中,服务器 .js 中的以下内容在所有其他路由之前工作:

app.use(function (req, res, next) {
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    res.header("Access-Control-Allow-Headers", "Access-Control-Allow-Origin");
    res.header("Access-Control-Allow-Origin", "*"); // update to match the domain you will make the request from
    next();
});