【问题标题】:socket.io: Cross-Origin Request Blocked on Firefoxsocket.io:在 Firefox 上阻止跨域请求
【发布时间】:2021-02-19 18:10:15
【问题描述】:

我在树莓派上运行 nodejs socket.io 服务器,在 Firefox 上运行 socket.io Web 客户端。

但是 Firefox 一直给我一个跨域请求被阻止(同源策略错误)。

    // nodeJS Server:
    var app = require('express')();
    var cors = require('cors');
    app.use(cors({origin: '*:*'}));
    var server = require('http').Server(app);
    var io = require('socket.io')(server);
    server.listen(3000);

    io.on('connection', function(socket) {
        socket.emit('announcements', { message: 'A new user jas joined!' });
    });
    

    //JS Browser client:
    const socket = io('ws://<INSERT_MY_EXTERNAL_IP>:3000');

    socket.on('connect', () => {
      socket.send('Hello!');
    });

我也试过:io.origins(...), io.set("origin", ...),但是那些一直说函数 originsset 未定义。

目前不知道该怎么做。

【问题讨论】:

    标签: node.js firefox socket.io cross-domain


    【解决方案1】:

    你可以在初始化服务器套接字时传入一个cors prop。

    传入一个配置对象,将cors 设置为true,例如。 cors: truecors: { origin: '*' }

    阅读更多关于here的信息。

    实际使用中(仅在 LAN 中测试):

    client.js

    const socket = io('ws://localhost:3000');
    socket.on('testing', res => { console.log(res) });
    

    server.js

    const app = require('express')()
    const server = require('http').createServer(app)
    
    const opts = { cors: { origin: '*' } }
    const io = require('socket.io')(server, opts)
    
    const cors = require('cors')
    app.use(cors())
    
    io.on('connection', (socket) => {
      console.log(`Client connected (id=${socket.id})`)
    
      socket.emit('testing', 123)
    
      socket.on('disconnect', () => {
        console.log(`Client disconnected (id=${socket.id})`)
      })
    });
    
    (
      port => server.listen(
        port, 
        () => console.log(`Express server running on port ${port}`)
      )
    )(3000)
    

    【讨论】:

    • 我试过这个。问题是,我没有连接到本地主机,而是连接到外部 IP 地址。我仍然收到跨域域错误。
    • 你确定你没有在语法上绊倒吗? socket.io 昨天引入了一些重大更改,因此在引用时可能值得仔细检查您的代码:github.com/socketio/socket.io/releases.
    • 没有语法错误。我相信这与我连接到外部 IP 地址有关,但我连接的机器恰好也在我的家庭网络上。所以当我在家时,我得到了 CORS(跨域域错误)。我也试过 3.0.0 和 2.3.0 的 socket.io。
    猜你喜欢
    • 2014-12-27
    • 2015-08-10
    • 2014-07-26
    • 2016-01-29
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多