![](/img/trans.png)
[英]socket.io cors error . i try to connect socket.io in laravel vuejs but cors error getting
[英]Socket.io gives CORS error even if I allowed cors it on server
我的节点服务器和客户端在不同的端口(分别为 3001、5347)上运行。 在我用过的客户端上,
var socket = io('http://127.0.0.1:3001');
在服务器上,我一一尝试了以下所有内容
1) io.set('origins', '*:*');
2) io.set('origins', 'http://127.0.0.1:5347');
3) io.set('origins', '*');
4) io.set('origins', '127.0.0.1:5347');
但我收到以下错误:
XMLHttpRequest 无法加载http://127.0.0.1:3001/socket.io/?EIO=3&transport=polling&t=1456799439856-4590 。 当凭据标志为真时,不能在“Access-Control-Allow-Origin”header 中使用通配符“*”。 因此不允许访问 Origin 'null'。
注意:我在服务器上使用 express 并且我已经通过以下方式使用 cors 中间件:
app.use(cors());
其中app和cors分别是express和cors的实例。
如果按如下方式运行 Express:
var app = express();
var server = app.listen(3000);
因此,要启动 socket.io,我们可以执行以下操作:
var io = require('socket.io').listen(server);
问题是由于以下代码:
var http = require('http').Server(app);
var io = require('socket.io')(http);
传递给 socket.io 的服务器对象与我正在侦听的服务器对象不同。
接受的答案已过时
根据官方文档,您可以将其添加到现有的 http 服务器https://socket.io/docs/server-initialization/#Attached-to-an-existing-HTTP-server
const server = require('http').createServer();
const options = { /* ... */ };
const io = require('socket.io')(server, options);
io.on('connection', socket => { /* ... */ });
server.listen(3000);
使用此选项对象启用 cors 似乎可以解决问题
options={
cors:true,
origins:["http://127.0.0.1:5347"],
}
早在 2014 年,他们就添加了对方法的支持作为 origin 参数的一部分:
let socket = io(web_server, {
cors: {
origin: function(origin, fn) {
if(origin == 'http://example.com')
return fn(null, origin);
return fn('Error Invalid domain');
}
},
});
您可以使用外部调用、数据库或数组来验证域...
函数 fn 执行以下逻辑:
function fn(err2, origin) {
if (err2 || !origin) {
next(err2);
} else {
corsOptions.origin = origin;
cors(corsOptions, req, res, next);
}
}
能够动态定义 CORS 标头https://github.com/socketio/socket.io/issues/1772
在迁移到socket.io v3.0+ 时,关于如何设置 CORS 的迁移发生了变化。 https://socket.io/docs/v3/migrating-from-2-x-to-3-0/index.html#Configuration
在 socket.io v3.0 之前:
const io = require("socket.io")(httpServer, {
origins: ["https://example.com"],
// optional, useful for custom headers
handlePreflightRequest: (req, res) => {
res.writeHead(200, {
"Access-Control-Allow-Origin": "https://example.com",
"Access-Control-Allow-Methods": "GET,POST",
"Access-Control-Allow-Headers": "my-custom-header",
"Access-Control-Allow-Credentials": true
});
res.end();
}
});
在 socket.io v3.0 之后:
const io = require("socket.io")(httpServer, {
cors: {
origin: "https://example.com",
methods: ["GET", "POST"],
allowedHeaders: ["my-custom-header"],
credentials: true
}
});
socket.io v3.0中的origin参数支持该函数
请注意,在将 app 传递到 require('http') 之前,您可以将 cors() 与 app 一起使用,然后将其传递到 socket.io。 按照这个顺序。 这也应该有效。
const app = express();
app.use(cors());
const http = require('http').Server(app);
const io = require('socket.io')(http);
希望能帮助到你。
如果您在 Chrome、Safari 和其他浏览器上运行 socket.io 应用程序,但在 Firefox 中仍然遇到 CORS 问题,并且您使用的是自签名证书,那么问题在于 Firefox 默认不接受自签名证书,并且您必须通过转到 Firefox 的首选项 > 证书 > 查看证书 > 添加例外来添加例外。
如果您不这样做,那么 Firefox 会显示您发布的具有误导性的错误,但在其开发人员工具的深处,您会发现此错误:MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT。 这表明 Firefox 根本不接受该证书,因为它是自签名的。
2021 年 8 月:
const express = require('express');
const http = require('http');
const { Server } = require('socket.io');
const app = express();
const cors = require('cors');
app.use(
cors({
origin: ['https://americanairlines.com'],
credentials: true,
methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
allowedHeaders: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept'],
})
);
const server = http.createServer(app);
const io = new Server(server, {
cors: { origin: ['https://americanairlines.com'], credentials: true },
});
io.on('connection', async (socket) => {
console.log('a user connected');
});
server.listen(5000);
以下代码有帮助:
const PORT = process.env.PORT || 4000;
const app = express();
const server = app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
const io = socket(server);
根据文档(如果您使用的是 JS,则可以忽略打字稿的内容):
const io: Server = new Server(server, {
cors: {
origin: "*",
methods: ["GET", "POST"]
},
});
这在 python-Flask-SocketIO 中对我有用
socketio = SocketIO(app,cors_allowed_origins="*")
对我来说,症状是 CORS(没有 Access-Control-Allow-Origin 标头),在花了数小时尝试这里的所有内容后,我意识到远程网络服务器未配置为正确处理 https://serverurl/socket.io。 在为“/socket.io”添加 nginx 位置处理程序后,错误消失了。
安装 socket.io 版本 2 解决了我的问题
npm install socket.io@2
如果您使用 Express,那么在您的服务启动代码之前定义一个这样的中间件......
app.use(function(request, response, next) {
response.header("Access-Control-Allow-Origin", "*");
response.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.