在 Node.js Express.js 服务器中添加标头后,Chrome 中仍然出现 CORS 错误

Posted

技术标签:

【中文标题】在 Node.js Express.js 服务器中添加标头后,Chrome 中仍然出现 CORS 错误【英文标题】:Still getting CORS error in Chrome after adding headers in Node.js Express.js server 【发布时间】:2018-12-12 06:24:41 【问题描述】:

我正在尝试对XML 文件执行简单的GET 请求,但我遇到了CORS 错误。

我尝试了多种解决方案,包括在我的server.js 文件中手动添加标题,以及使用cors NPM 包。使用这两种方法,如果我点击 Postman 中的端点,我可以看到附加到请求的标头以及响应。

但在 Google Chrome 中,标头并未附加到请求中。这是我的index.html 文件中的代码:

<body>
  <h1>test</h1>
  <script src="https://code.jquery.com/jquery-3.3.1.js" integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60=" crossorigin="anonymous"></script>
  <!-- <script src="./server.js"></script>  -->
  <script>
    var xhr = new XMLHttpRequest();
    xhr.open('GET', http://11.111.111.111/web/data/data.xml, true);
    xhr.setRequestHeader('Access-Control-Allow-Origin', '*') 
    xhr.withCredentials = true;
    xhr.send(null);
  </script>
</body>

请注意,我已将尝试从中获取信息的 XML 页面的 URL 替换为占位符。

这是我的server.js 文件中的代码:

var express = require("express");
var bodyParser = require("body-parser");
var path = require("path");
var cors = require('cors')
// Sets up the Express App
var app = express();

var PORT = 3000;
app.use(cors())
app.options('*', cors()) // include before other routes

// Sets up the Express app to handle data parsing
app.use(bodyParser.urlencoded(
  extended: true
));
app.use(bodyParser.json());

// Routes
app.get("/test", function(req, res) 
   //res.set(
   // 'Access-Control-Allow-Origin': ['*'],
   // 'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE',
   // 'Access-Control-Allow-Headers': 'Content-Type'
   // );
  res.sendFile(path.join(__dirname, "./index.html"));
  console.log('hit me')
  console.log(res);
);

app.get("/", function(req, res) 
  res.send('Houston, we have a problem.')
);

// Starts the server to begin listening
app.listen(PORT, function() 
  console.log("App listening on PORT " + PORT);
);

这是邮递员输出的屏幕截图

我将xhr.setRequestHeader('Access-Control-Allow-Origin', '*') 添加到我的客户端xhr 请求中,然后我切换到使用cors 包。现在我得到这个错误:

Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

我按照npm cors 文档中的说明添加了app.options('*', cors()) // include before other routes,但我仍然遇到同样的错误。但是,标头附加到开发工具中的请求。我更新了这篇文章中的代码和屏幕截图以反映这些变化。

来自开发工具的屏幕截图:

【问题讨论】:

您是否尝试过添加 Chrome CORS 扩展程序? chrome.google.com/webstore/detail/allow-control-allow-origi/… @John 虽然该插件在理论上听起来很有用,但它只会在您部署到 prod 之后才会出现问题。 是的 它适用于扩展,但我需要它在没有它的情况下工作。 是的,所以...您没有在静态文件的响应中设置 CORS 标头。您只将它们设置在 /test 路线上。 @KevinB 感谢您引导我朝着正确的方向前进。 【参考方案1】:

如果只是用于本地测试,试试这个:https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi 或试试这个https://www.npmjs.com/package/cors。

从'cors'导入cors

app.use(cors())

【讨论】:

是的,我尝试过使用cors npm 包,但我遇到了同样的问题【参考方案2】:

终于收到了该团队的回复,事实证明服务器已配置为阻止所有 cors 请求。

【讨论】:

以上是关于在 Node.js Express.js 服务器中添加标头后,Chrome 中仍然出现 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 Node.js/Express 中动态导入 TypeScript 模块吗?

Node.js - Express.js JWT 总是在浏览器响应中返回一个无效的令牌错误

在 Node.js/Express.js 中,如何将 JSON 对象从服务器传输到客户端?

IBM 向 Node.js 捐赠 Express 框架,为 Express 丑闻画上了句号

Node.js + Express.js |尝试设置 HTTPS 服务器

从 POST 访问中隐藏 Node.js&Express 中的错误消息