Express 启用 COR 标头仍然会导致错误

Posted

技术标签:

【中文标题】Express 启用 COR 标头仍然会导致错误【英文标题】:Express enabling CORs headers still cause errors 【发布时间】:2017-02-20 12:36:51 【问题描述】:

使用http://enable-cors.org/ for express 提供的代码,我已添加到我的 index.js 文件中

/*these first five line direct from http://enable-cors.org/.com*/
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();
);




var PORT = 3333;
app.listen(PORT, function()
  console.log('listening on port', PORT);
)

request(url: 'http://bl.ocks.org/mbostock/raw/4090846/us.json', json: true, function(err, data)
  app.get('/us', function(req, res, next)
    console.log(req) //prints correctly
    res.json(data.body);
    );
);

localhost:3333/us 正确显示 json,但从 localhost:3000(browsersync 服务的端口)发出请求失败并出现错误

d3.min.js:1XMLHttpRequest cannot load localhost:3333/us. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.

这不再是在 express 上为 localhost 启用 CORS 的正确方法了吗?我还尝试将 app.use 方法 '*''/us' 作为其第一个参数传递,但没有运气。

【问题讨论】:

这是一个重要线索:“跨源请求仅支持协议方案”请包括您用于发送此 ajax 请求的代码,因为显然它不是 http 或 https,意思是可能与您的服务器无关。 @KevinB 你是对的。当我添加 http 时,我收到了 ERR_CONNECTION_REFUSED 但我相信这是因为我打开了 CORs chrome 扩展。删除它已经消除了错误。谢谢。 【参考方案1】:

进行 Ajax 调用时,您需要一个包含协议的完全限定 URL。这不是合法的网址:

localhost:3333/us

这是您可以在浏览器中输入的内容,浏览器会自动为其添加协议(浏览器会做各种事情来尝试将您在 URl 栏中输入的内容变成合法的 URL,但该逻辑确实如此通过 javascript 和 Ajax 发出的请求不会发生)。相反,将 URL 更改为:

http://localhost:3333/us

【讨论】:

【参考方案2】:

我建议仅 npm 安装“cors”作为依赖项。完成后,只需在要允许 CORS 的所有路由之前 require 和 app.use 即可。

// Dependancies
var cors = require('cors');

// Init express app
var app = express();
app.use(cors());

// Routes now allow cors
app.get('/api/endpoint', controllers.endpoint);

【讨论】:

以上是关于Express 启用 COR 标头仍然会导致错误的主要内容,如果未能解决你的问题,请参考以下文章

重复的访问控制允许来源:* 导致 COR 错误?

可以使用 launchSettings.json 启用 IIS Express 的 access-control-allow-origin 响应标头吗?

如果启用了身份验证,Azure 上的查询/标头太大

在带有 Angular 的 Spring Boot 中启用了 Cors,但仍然出现 cors 错误

错误[ERR_HTTP_HEADERS_SENT]:无法在将标头发送到客户端后设置标头 - Express + Request

C# 将自定义标头设置为 httpclient 会导致错误,因为标头名称被误用