Javascript socket.io和#x27;访问控制允许原点';错误

Javascript socket.io和#x27;访问控制允许原点';错误,javascript,node.js,socket.io,cors,Javascript,Node.js,Socket.io,Cors,我已经设置了一个节点服务器,套接字io正在转动,并试图通过另一台服务器连接到它。 但是,不同计算机上的某些浏览器会出现此错误,并使其始终重新连接: 无法加载XMLHttpRequest。当请求的凭据模式为“包括”时,响应中的“访问控制允许来源”标头的值不得为通配符“*”。因此,不允许访问源“”。XMLHttpRequest启动的请求的凭据模式由withCredentials属性控制 我的js配置: var port = 3000; var fs = require('fs'); var http

我已经设置了一个节点服务器,套接字io正在转动,并试图通过另一台服务器连接到它。 但是,不同计算机上的某些浏览器会出现此错误,并使其始终重新连接:

无法加载XMLHttpRequest。当请求的凭据模式为“包括”时,响应中的“访问控制允许来源”标头的值不得为通配符“*”。因此,不允许访问源“”。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>

变量套接字=io('https://serverDomain.net: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");
    });
我找到了解决办法。 由于某些原因,并非所有服务器都始终允许使用默认的传输方法

因此,我在客户端指定了一种中立的传输方法,如下所示:

var socket = io('https://yourDomain:3000', { transport : ['websocket'] });

另外,请检查服务器端日志是否包含此消息“信息-未处理的socket.io url”。如果显示,请将您的socket.io版本升级到1.0+。我用这种方法解决了这个问题

npm安装插座。io@1.0

或者像这样更改package.json:

"dependencies": {
    "socket.io": "^1.0"
}

适用于Socekt io v3的用户

您需要在服务器配置的
cors
选项中使用选项
credentials

例如:

const io = require('socket.io')(strapi.server, {
  cors: {
    origin: "http://localhost:3000",
    credentials: true
  }
});
文件:

相关主题:

迁移指南


在客户端代码中添加此项,我收到错误“不存在访问控制允许源站”标题。所以在客户端添加了这个

var连接选项={
“强制新连接”:正确,
“重新连接尝试”:“无限”,
“超时”:10000,
“传输”:[“websocket”]
};

this.socket=io.connect('http://localhost:5000连接选项)试试这个,它对我有用:

const io = require("socket.io")(httpServer, {
  cors: {
    origin: "http://localhost:8080",
    methods: ["GET", "POST"]
  }
});

我最近遇到了同样的问题,对我有效的解决方案如下:

//在React项目中安装socket.io-client,然后

import io from 'socket.io-client'   

var socket = io('http://localhost:<your_port_number>', {transports: ['websocket', 'polling', 'flashsocket']});
从“socket.io客户端”导入io
变量套接字=io('http://localhost:“,{传输:['websocket','polling','flashsocket']});
这对我很有效

var socket = io('http://yourDomain:port', { transports: ['websocket', 'polling', 'flashsocket'] });

在客户端上指定以下内容

const socket=io('https://yourDomain:3000“,{transports:['websocket']})


而不是
const socket=io('https://yourDomain:3000');

没有改变任何内容,不断断开与XMLHttpRequest相同错误的重新连接。谢谢你的尝试。谢谢你的回答李草萌,但我有一些功能依赖于2.0+版本的socket io。在任何情况下,显式地向websocket声明协议的传输方法对我来说都是可行的(请参阅接受的答案)。这对我来说是可行的。
transport
对我不起作用,
transports
对我起作用。我正在使用socket.io-client 3.1.2它对我有效。我真的很感激你,丹尼尔。救生员工作得很好。这段代码非常感谢你。非常欢迎@samita:)祝你度过愉快的一天!