首页 > 解决方案 > NodeJS + Express Cors + SocketIO = XMLHttpRequest 错误

问题描述

我用nodejs创建了一个简单的应用程序来测试socketIO,我在我网站的一个子域上运行了服务器,而客户端(在ReactJS中)在另一个子域上。

我的服务器总是向我发送著名的错误:

从源“https://”访问“https:///socket.io/?EIO=3&transport=polling&t=MyFav6q”的 XMLHttpRequest 已被 CORS 策略阻止:没有“Access-Control-Allow-Origin”标头出现在请求的资源上。

我尝试了超过 10 种解决方案,但它们不起作用,我不知道这里有什么问题。

应用程序.js

const cors = require("cors");
const app = require("express")();
app.use(cors());
const server = require('http').createServer(app);
const io = require('socket.io').listen(server);

io.sockets.on('connection', function (socket) {
    socket.emit('message', 'Vous êtes bien connecté !');

    socket.on('message', function (message) {
        console.log(socket.pseudo + ' me dit: ' + message);
        socket.broadcast.emit('message', socket.pseudo + " dit: "+message);
    });

    socket.on("pseudo", pseudo => {
        socket.pseudo = pseudo;
        socket.broadcast.emit('message', socket.pseudo + " s'est connecté !");
    });

    socket.on("reset-draw", data => {
        socket.broadcast.emit('reset-draw', socket.pseudo + " a reset le dessin !");
    });

    socket.on("draw-rect", data => {
        console.log(data);
        socket.broadcast.emit('draw-rect', data);
    });
});

server.listen(8100);

socketIO 部分的客户端:

import socketIOClient from "socket.io-client";

[...]

componentDidMount() {
        this._context = this.refs.canvas.getContext('2d');

        const socket = socketIOClient("https://<ServerURL>");
        socket.emit('pseudo', "testing_guy");
        socket.on("reset-draw", data => {
            this._context.clearRect(0, 0, 500, 500);
            console.log(data);
        });

        socket.on("draw-rect", data => {
            this.drawRect(data);
        });
    }

标签: node.jsreactjsexpresssocket.iocors

解决方案


在服务器上设置origins属性。io

io.origins('*')

默认情况下,任何情况下都允许:

Sets the allowed origins value. Defaults to any origins being allowed. If no arguments are supplied this method returns the current value.

You can also passo a validation function


推荐阅读