我已经设置了一个带有套接字 io 转动的节点服务器,并尝试通过另一台服务器连接到它。 然而,不同计算机上的某些浏览器给我这个错误,并使其始终重新连接:
XMLHttpRequest 无法加载 https://serverDomain.net:3000/socket.io/?EIO=3&transport=polling&t=Lo_SdiU。当请求的凭据模式为“include”时,响应中“Access-Control-Allow-Origin”标头的值不能是通配符“*”。因此,不允许访问源“https://www. differentServerDomain.fr”。 XMLHttpRequest 发起的请求的凭证模式由 withCredentials 属性控制。
我的js配置:
var port = 3000;
var fs = require('fs');
var https = require('https');
var express = require('express');
var app = express();
var options = {
key: fs.readFileSync('/etc/letsencrypt/live/devpeter.net/privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/live/devpeter.net/fullchain.pem')
};
var server = https.createServer(options, app);
var io = require('socket.io')(server);
io.origins('https://www.differentServerDomain.fr:* https://www.differentServerDomain.fr/wp-admin/index.php:*');
// start of server
server.listen(port, function(){
console.log('listening on *: '+ port + "\n");
});
我使用的是node 8.0和socket io 2.2, 我们将非常感谢您的帮助。
编辑: 这是客户端代码:
<script src="https://serverDomain.net:3000/socket.io/socket.io.js"></script>
<script>
var socket = io('https://serverDomain.net:3000');
</script>
我找到了解决办法。 由于某种原因,并非所有服务器都始终允许默认传输方式。
所以我在客户端指定了一个中立的运输方式,像这样:
var socket = io('https://yourDomain:3000', { transports : ['websocket'] });
这对我有用
var socket = io('http://yourDomain:port', { transports: ['websocket', 'polling', 'flashsocket'] });
对于Socekt io v3
的用户您需要在服务器配置的
credentials
选项中使用选项cors
。
示例:
const io = require('socket.io')(strapi.server, {
cors: {
origin: "http://localhost:3000",
credentials: true
}
});
文档:
https://expressjs.com/en/resources/middleware/cors.html https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
相关主题:
迁移指南
https://socket.io/docs/v3/migration-from-2-x-to-3-0/index.html#CORS-handling
在客户端代码中添加此内容,我收到错误“不存在 Access-Control-Allow-Origin”标头”。所以在客户端添加了这个。
var connectionOptions = {
"force new connection" : true,
"reconnectionAttempts": "Infinity",
"timeout" : 10000,
"transports" : ["websocket"]
};
this.socket = io.connect('http://localhost:5000',connectionOptions);
我最近遇到了同样的问题,对我有用的解决方案如下:
//在React项目中安装socket.io-client然后
import io from 'socket.io-client'
var socket = io('http://localhost:<your_port_number>', {transports: ['websocket', 'polling', 'flashsocket']});
试试这个,它对我有用:
const io = require("socket.io")(httpServer, {
cors: {
origin: "http://localhost:8080",
methods: ["GET", "POST"]
}
});
在客户端指定以下内容。
const socket = io('https://yourDomain:3000', { transports: ['websocket'] });
而不是
const socket = io('https://yourDomain:3000');
希望本次修改对您有所帮助。
var port = 3000;
var fs = require('fs');
var https = require('https');
var express = require('express');
var app = express();
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "https://www.differentServerDomain.fr https://www.differentServerDomain.fr");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
var options = {
key: fs.readFileSync('/etc/letsencrypt/live/devpeter.net/privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/live/devpeter.net/fullchain.pem')
};
var server = https.createServer(options, app);
var io = require('socket.io')(server);
// start of server
server.listen(port, function(){
console.log('listening on *: '+ port + "\n");
});
另请检查服务器端日志是否包含此消息“info - 未处理的socket.io url”。如果显示,请将您的 socket.io 版本升级到 1.0+。我用这个方法解决了。
npm install [电子邮件受保护]
或者像这样更改package.json:
"dependencies": {
"socket.io": "^1.0"
}
添加以下参数解决了reactjs中客户端套接字连接中的CORS问题。
{ 传输:['websocket'] }
从'socket.io-client'导入socketIOClient;
const socket = socketIOClient('http://localhost:5000', { 传输: ['websocket'] });
socket.on('connect', () => {
console.log('Connected to server');
});