Node.js 使用节点、react和Socket.io时发生Socket.io cors错误

Node.js 使用节点、react和Socket.io时发生Socket.io cors错误,node.js,reactjs,sockets,Node.js,Reactjs,Sockets,我们使用CORS允许所有来源 app.use(cors()); 服务器在端口4000上运行,客户端在端口3000上运行 这是我的server.js代码 const cors = require("cors"); const http = require("http"); const socketIO = require("socket.io"); app.use(cors()); const port = process.env.PORT || process.env.DEFAULT_PO

我们使用CORS允许所有来源

app.use(cors());
服务器在端口4000上运行,客户端在端口3000上运行

这是我的server.js代码

const cors = require("cors");
const http = require("http");
const socketIO = require("socket.io");

app.use(cors());

const port = process.env.PORT || process.env.DEFAULT_PORT;
console.log("port: ", port);
app.listen(port, () => {
  console.log(`App listening at ${port}...`);
});

const server = http.createServer(app);

const io = new socketIO(server, {
  transports: ["websocket"],

});
React js代码

  constructor(props) {
    super(props);
    try {
      this.socket = io("http://localhost:4000", { transport: ["websocket"] });

      this.socket.on("Chat-event", data => {
        console.log("socketdata", data);
      });
    } catch (error) {
      console.log("hiterror", error)
    }
  }
在允许所有源代码之后,我在客户端不断地得到这个错误


CORS策略已阻止从源“”访问“”处的XMLHttpRequest:当请求的凭据模式为“包括”时,响应中“访问控制允许源”标头的值不得为通配符“*”。XMLHttpRequest启动的请求的凭据模式由withCredentials属性控制,请尝试使用cors凭据配置:

app.use(cors({credentials: true}));

尝试使用cors凭据配置:

app.use(cors({credentials: true}));

请允许所有人在服务器端
socket.io

const socketIO = require('socket.io')(server, { origins: '*:*'});
或者,您可以将socketIO原点设置为
*

socketIO.set('origins', '*:*');

请允许所有人在服务器端
socket.io

const socketIO = require('socket.io')(server, { origins: '*:*'});
或者,您可以将socketIO原点设置为
*

socketIO.set('origins', '*:*');

对于socket.io版本3.x.x cors配置已更改,我通过在套接字创建中添加选项来修复它。 在2.x.x版本上也试过了,效果不错

  const io = socketio(httpServer, {
  cors: {
    origin: "http://localhost:3000",
    methods: ["GET", "POST"],
    credentials: true
  }
});
这是资源


奖金:如果遇到错误请求请确保客户端和服务器具有相同版本的socket.io。

对于socket.io版本3.x.x cors配置已更改,我通过在套接字创建中添加选项来修复它。 在2.x.x版本上也试过了,效果不错

  const io = socketio(httpServer, {
  cors: {
    origin: "http://localhost:3000",
    methods: ["GET", "POST"],
    credentials: true
  }
});
这是资源


奖金:如果遇到错误请求请确保客户端和服务器具有相同版本的socket.io。

@user4860402给了我解决方案,问题是默认情况下npm安装的是socket.io客户端v2.X.X,但在服务器上我使用的是最新的verion(也由npm提供)3.0.5
所以所有问题,包括400错误,都是因为客户端和服务器verion不匹配。

@user4860402给了我解决方案,问题是默认情况下npm安装的是socket.io client v 2.X.X,但在服务器上我使用的是最新的verion(也由npm提供)3.0.5
因此,包括400错误在内的所有问题都是因为客户端和服务器verion不匹配。

通过以下步骤,您可以消除这些错误

// 1) on server side

const cors = require('cors');
const socketio = require('socket.io')
const http = require('http');
const server = http.createServer(app);

const io = socketio(server, {
    cors: {
        origin: localhost:3000/, //your website origin
        methods: ["GET", "POST"],
        credentials: true
    }
});

// 2) add these middlewares
app.use(cors())
app.options('*', cors());

// 3) on client-side
import io from 'socket.io-client'
let socket = io.connect(localhost:8080, { transports: ['websocket'] }) // your local server

通过执行这些步骤,您可以消除这些错误

// 1) on server side

const cors = require('cors');
const socketio = require('socket.io')
const http = require('http');
const server = http.createServer(app);

const io = socketio(server, {
    cors: {
        origin: localhost:3000/, //your website origin
        methods: ["GET", "POST"],
        credentials: true
    }
});

// 2) add these middlewares
app.use(cors())
app.options('*', cors());

// 3) on client-side
import io from 'socket.io-client'
let socket = io.connect(localhost:8080, { transports: ['websocket'] }) // your local server

检查此仍然得到相同的错误检查此仍然得到相同的错误没有任何区别IDN没有任何区别DOE没有任何区别,请记住,我正在为客户端和服务器使用socket.io版本2.2.0。您检查了.htaccess文件吗?也许它可以帮助您从哪里访问这个?请检查您的服务器>>应用程序并添加
标题添加访问控制允许来源“*”标题添加访问控制允许标题“来源,x-requested-with,内容类型“标题添加访问控制允许方法”放置、获取、发布、删除,选项“
没有任何区别,还记得我在客户端和服务器上都使用socket.io版本2.2.0吗?您是否检查了.htaccess文件?也许它可以帮助您从哪里访问这个?请检查您的服务器>>应用程序并添加
标题添加访问控制允许来源“*”标题添加访问控制允许标题“来源,x请求,内容类型“标题添加访问控制允许方法”放置,获取,发布,删除,选项”
非常感谢,这个答案给了我答案。非常感谢,这个答案给了我答案。