【问题标题】:Access-Control-Allow-Origin error on two nodejs Servers两个nodejs服务器上的Access-Control-Allow-Origin错误
【发布时间】:2023-04-02 23:38:01
【问题描述】:

我遇到了从页面的套接字 IO 连接问题,由 nodeJs 服务器生成,到另一个由 Socket.IO 监听的 nodeJs 服务器

这个想法包含两个任务: 通过一台 Express 服务器生成 HTML 模板 支持另一台express server的socket io

这里是 server.js 代码:

const app = require('express');
const util = require('util');
const http = require('http');
const fs = require('fs');
const debug = console.log;
const moment = require('moment');
const event = require('events').EventEmitter;
var server = app();
server.use(function (req, res, next) {
        res.setHeader('Access-Control-Allow-Origin', '*');
        res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
        res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
        res.setHeader('Access-Control-Allow-Credentials', true);
        next();
    }
);
server.use(app.json());
server.use(app.urlencoded());
server.use(app.logger());
server.use(app.favicon());
server.use(app.static(__dirname + '/core'));
server.get('*', function (req, res, next) {
    debug('Connection refused: \t' + req.url);
    var r = (e.url.split('/')[2] == 'socket.io.js') ? server.st.socket : server.st.tmp; // Return TMP-HTML FILE OR SOCKET.IO JS FILE FOR CLIENT
    res.send(r);
    res.end();
});
server.st = {
        socket: fs.readFileSync('./socket.io.js', 'utf-8')
        tmp: fs.readFileSync('./tmp.html', 'utf-8')
}
server.listen(81);
*******************************************************************************
//Creating SOCKET server
    io = require('socket.io').listen(82);
    io.configure(function () {
        io.set('log level', 1);
        io.set('origin', '*');
    });
    io.sockets.on('connection', function (socket) {
        debug('IT IS WORK')
    })

这里是 tmp.html 代码:

<!DOCTYPE html>
<html>
<head>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        var socket = io.connect('http://localhost:82');
    </script>
</head>
<body>
</body>

以及客户端默认的 Socket.io.js

这是客户端的错误

XMLHttpRequest cannot load http://localhost:82/socket.io/?EIO=2&transport=polling. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:81' is therefore not allowed access. 

这个*有什么问题?

【问题讨论】:

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


    【解决方案1】:

    答案是:

    必须支持套接字的 HTTP 服务器,在股票套接字选项中有默认的原始设置,不能通过 var IO configurate 更改,manager.js 在 778 行(v0.9),您必须在原始选项中写入类似这样的内容: headers['Access-Control-Allow-Origin'] = '*'; 或

    最好的解决办法是:

    必须支持套接字的 HTTP 服务器,具有与它自己的侦听器绑定的地址,它创建一个请求此隧道的套接字 beetwen 客户端,使用我从 localhost:81 获取的 socket.io.js 文件。 这就是为什么我问自己:“为什么我从服务器获取套接字客户端文件,与套接字服务器无关?” 并改变了

    <script src="http://localhost:82/socket.io/socket.io.js"></script>
    <script>
        var socket = io.connect('http://localhost:82');
    </script> 
    

    而且它有效。 THX,来自俄罗斯的厚爱。再见。

    【讨论】:

      【解决方案2】:

      您正在使用端口 81 创建 express 套接字,然后在端口 82 上为 socket.io 创建另一个套接字,然后从前端尝试从 express 加载 socket.io.js 而它不提供服务(您应该将 socket.io 绑定到与 express 相同的服务器),然后您尝试将 http 协议连接到端口 82 - 这被视为另一个域,并且对于 CORS 将失败。

      不要试图拼凑代码并期望它可以工作,你必须先了解它的作用,然后才能使用它,否则你不会走得很远。

      请按照官网socket.io示例进行快递:http://socket.io/#how-to-use

      更新:根据您在 cmets 中提到的要求,您需要另一个域,您可能需要检查其他 2 个选项:代理来自提供 html 的域的 WS 流量或使用对 CORS 做得很好的替代方案,例如 SockJS

      【讨论】:

      • 但这就是重点。我需要 2 个网络服务器。一种用于生成模板和渲染静态文件。第二个必须支持网络套接字,女巫必须适用于与任何其他域的所有连接。
      • socket.io/#how-to-use 这个我读了很多遍,但没有答案
      • 主要问题是link,但是当使用“io = require('socket.io').listen(82);”中的 createServer() 的库存 HTTP 模块时设置原点:'*';对 CORS 没有反应。但是如果手动创建服务器,使用 requestListener AS express 应用程序,效果很好,但是 socket.io 不监听它。
      • 还有更多。我正在使用节点,因为它是 0.6 版本
      • 由于安全和强制执行,您将无法建立从一个域到另一个域的 WS 连接 - 无论标头如何,浏览器都不允许这样做。您可能想检查其他选项:在同一域上代理 WS,或检查旨在与 CORS 开箱即用的 SockJS:github.com/sockjs/sockjs-node
      猜你喜欢
      • 2018-12-30
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 2020-06-03
      • 2016-08-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多