套接字 IO 错误“对 XMLHttpRequest 的访问已被 CORS 策略阻止”
Posted
技术标签:
【中文标题】套接字 IO 错误“对 XMLHttpRequest 的访问已被 CORS 策略阻止”【英文标题】:Socket IO error "Access to XMLHttpRequest has been blocked by CORS policy" 【发布时间】:2020-05-02 01:53:35 【问题描述】:我的应用最近收到错误
"访问 XMLHttpRequest 在 'https://my-service-domain/socket.io/?EIO=3&transport=polling&t=M-eWtUQ' 来自原点“https://my-app-domain”已被 CORS 策略阻止: 请求中不存在“Access-Control-Allow-Origin”标头 资源。”
当我连接到 socket.io 时。这个问题我还没有找到解决办法,下面我会详细描述,有没有人遇到过这个错误。
服务器配置:
var express = require('express');
var app = express();
app.use(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");
res.header("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS");
next();
);
var http = require('http');
var server = http.createServer(app);
var io = require('socket.io').listen(server, log:false, origins:'*:*');
客户端配置:
var socket = io('https://my-service-domain', transports: ['polling']);
socket.on(channel_id, function(data)
// some code
);
我尝试切换websocket连接选项var socket = io('https://my-service-domain', transports: ['websocket'])
,报错
"WebSocket 连接到 'wss://my-service-domain/socket.io/?EIO=3& transport = websocket' 失败:WebSocket 握手期间出错: 意外响应代码:400"
【问题讨论】:
这能回答你的问题吗? Socket.io + Node.js Cross-Origin Request Blocked 【参考方案1】:
If you are using Socket.IO v3, you need to explicitly enable Cross-Origin Resource Sharing (CORS).
const io = require("socket.io")(httpServer,
cors:
origin: "http://localhost:8080",
methods: ["GET", "POST"]
);
httpServer.listen(3000);
【讨论】:
确实适用于浏览器,但移动应用程序呢?他们的起源总是在变化.. 感谢这使我免于进行几个小时的在线研究 :)【参考方案2】:它是 100% 工作的。我花了 2 个小时在里面,终于找到了答案。 只需用这个替换代码...
const express = require("express")
var app = express();
var server = app.listen(4000);
var io = require('socket.io')(server,
cors:
origin: '*',
);
【讨论】:
【参考方案3】:如果您使用的是 HTTPS 协议,请尝试使用以下 sn-p:
var http = require('https');
【讨论】:
【参考方案4】:如果您遇到相同类型的错误,即您对请求的访问被阻止,请更改您的代码...... const socket = io('http://localhost:8000'); 对此 const socket = io('http://localhost:8000',transports: ['websocket']);
这将使您的代码运行
【讨论】:
这并不能解决这个问题,我不明白为什么会这样【参考方案5】:对于多个网址:
var io = require('socket.io')(server,
cors:
origin: ['url1','url2',..]
);
【讨论】:
【参考方案6】:您可以尝试使用cors
npm 包。使用以下命令安装CORS:
npm install cors
然后在你的应用文件的顶部,将安装好的CORS包导入为,
const cors = require('cors');
然后使用这个常量变量作为中间件,
app.use(cors());
它将处理您需要的所有 CORS 相关选项和设置。
注意:您应该在启动路由器之前使用app.use(cors());
行。否则可能无法正常工作。
【讨论】:
【参考方案7】:当我在 Heroku 上托管使用 socekt.io 的 nodejs 应用程序时,我的浏览器中出现了同样的错误。问题是我没有在 package.json 文件中添加启动脚本。所以heroku无法启动我的应用程序。当我添加启动脚本时,问题就解决了。
【讨论】:
什么是start script
?
@OliverD 我认为他指的是 package.json 脚本,例如测试和启动。如果你的 package.json 文件中没有定义启动脚本,可能会导致各种部署环境启动失败。以上是关于套接字 IO 错误“对 XMLHttpRequest 的访问已被 CORS 策略阻止”的主要内容,如果未能解决你的问题,请参考以下文章
socket.io 错误 - Web 套接字连接在建立连接之前关闭
socket.io 错误 - Web 套接字连接在建立连接之前关闭