gpt4 book ai didi

node.js - 无法创建到 Node.js socket.io 服务器的跨域 websocket 连接

转载 作者:搜寻专家 更新时间:2023-10-31 22:48:31 27 4
gpt4 key购买 nike

根据我的搜索,这不应该那么难,而且到目前为止我已经尝试了很多事情,但都没有成功。我有一个在 Heroku 上运行的 Node.js 服务器,它创建了一个 socket.io 服务器(我也尝试过在 Nodejitsu 上托管它,但没有帮助)。如果我从要创建 websocket 连接的实际 Node.js 服务器提供页面,socket.io 套接字连接没有问题,但我无法进行任何跨域套接字连接尝试。

我已尝试通过多种方式跨域连接到此 socket.io 服务器:

(1) 一个简单的本地 HTML 文件,其中包含一些脚本,可以从 Node 服务器(使用 $.getScript)成功获取客户端 socket.io 库,然后尝试创建套接字连接(var socket = io.connect(' nodejs_server_hostname:port_num');),失败。

(2) 在本地运行 rails app server(开发模式),为包含 javascript 的客户端提供响应,该 javascript 尝试以与方法 (1) 相同的方式形成 websocket 连接,但失败

(3) 在Heroku 中托管rails 应用程序,并执行与方法(2) 相同的操作。这也失败了。我确保按照 Heroku 文档 ( https://devcenter.heroku.com/articles/heroku-labs-websockets ) 中的指定启用 websockets。再一次,如果请求是由客户端尝试与之建立 socket.io 连接的实际 Node.js 服务器提供的,则一切正常。

socket.socket.on('error') 事件在所有三次尝试中都被触发。

我尝试使用以下代码修改 Rails 应用程序中的 http 响应 header :

response.headers['Access-Control-Allow-Origin'] = '*'

这会正确设置 header (我在从 Rails 服务器请求页面后进行了检查),但它没有解决套接字连接问题。

我在执行日志记录的 Node.js 服务器上创建了一个 socket-io 授权回调,似乎这个回调对于跨域套接字连接尝试根本没有命中。所以 Node.js 服务器似乎从来没有看到 websocket 连接尝试,这让我很困惑。

下面我会贴上所有相关的代码文件。

Node.js 服务器文件:

var http = require('http'),
express = require('express'),
whiskers = require('whiskers'),
redis = require('redis'),
port = process.env.PORT || 5000,
app = express(),
server = http.createServer(app).listen(port),
io = require('socket.io').listen(server);

console.log('---- ' + port);
console.log(port);
console.log('---- ' + port);

io.configure(function () {
io.set('authorization', function (handshakeData, callback) {
console.log("-- inside io.set('authorization, cb)")
console.log('-- handshakeData:');
console.log(handshakeData);
console.log('-- end of handshakeData logging --');
callback(null, true); // error first callback style
});
});

app.configure(function() {
app.use(express.static(__dirname + '/public'));

app.set('views', __dirname + '/views');
app.set('view options', { layout: false });

app.engine('.html', whiskers.__express);
});


app.get('/', function(req, res) {
res.render('index.html');
});

io.sockets.on('connection', function(socket) {
console.log('---- new client connected ----');
console.log(socket);
console.log('---- end of socket details logging for new client connection ----');

socket.emit('news', { hello: 'world' });

socket.on('my other event', function(data) {
console.log("-- server -- inside socket.on 'my other event' callback");
console.log(data);
});

socket.on('button clicked', function(data) {
console.log("-- server -- inside socket.on 'button clicked' callback");
console.log(data);

io.sockets.emit('news', { info: 'the button was clicked' });
});
});

这是来自 Rails 应用程序的客户端 javascript 文件:

$(document).ready(function() {
console.log('-- inside chat.js -- document is ready');

$('#join-chat-container').hide();
$('#new-message-container').hide();

//$.getScript('http://node-server-for-rails-chat.herokuapp.com/socket.io/socket.io.js')
$.getScript('http://node-server-for-rails-chat.jit.su/socket.io/socket.io.js')
.done(function( script, textStatus ) {
console.log("-- socket.io.js loaded and executed -- textStatus: " + textStatus);
setup_socket();
})
.fail(function( jqxhr, settings, exception ) {
console.log("-- socket.io.js load error -- exception:");
console.log(exception);
console.log("-- jqxhr: " + jqxhr);
});
});

function setup_socket() {
//var socket = io.connect('node-server-for-rails-chat.herokuapp.com', { port: 19364 });
//var socket = io.connect('node-server-for-rails-chat.jit.su', { port: 5000 });
var socket = io.connect('node-server-for-rails-chat.herokuapp.com:27305');

socket.socket.on('error', function (reason) {
console.log('--- cant connect');
console.log(reason);
console.error('Unable to connect Socket.IO', reason);
});

socket.on('connect_failed', function() {
console.log('connect failed');
});

socket.on('connect', function() {
console.log('successfully connected!');
});


socket.on('message', function (message_html) {
console.log("-- client -- inside socket.on('message', cb) callback");
console.log("-- client -- message_html: " + message_html);

add_message(message_html);
});

if (!socket.socket.connected) {
console.log(socket);
console.log("-- Error connecting with socket");
}
socket_loaded(socket);
};

function socket_loaded(socket) {
// this part contains irrelevant (not socket related) code
}

//more irrelevant code excluded for brevity (add_message function, plus other stuff)

这是我在本地浏览器中打开的独立 HTML 文件:

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-git.js"></script>
<script>
$(document).ready(function() {
if (typeof jQuery !== 'undefined') {
console.log('-- client -- jQuery library loaded successfully');

$('#myButton').on('click', function() {
console.log("-- client -- inside jquery '#myButton' click callback");
socket.emit('button clicked', { button: '#myButton' });
});
}

$.getScript('http://node-server-for-rails-chat.herokuapp.com/socket.io/socket.io.js')
.done(function( script, textStatus ) {
console.log("-- socket.io.js loaded and executed -- textStatus: " + textStatus);
socket_is_loaded();
})
.fail(function( jqxhr, settings, exception ) {
console.log("-- socket.io.js load error -- exception:");
console.log(exception);
console.log("-- jqxhr: " + jqxhr);
});
});

function socket_is_loaded() {
//var socket = io.connect('node-server-for-rails-chat.jit.su:5000');
var socket = io.connect('node-server-for-rails-chat.herokuapp.com:27305');

socket.socket.on('error', function (reason) {
console.log('--- cant connect');
console.log(reason);
console.error('Unable to connect Socket.IO', reason);
});

socket.on('connect_failed', function() {
console.log('connect failed');
});

socket.on('connect', function() {
console.log('successfully connected!');
});

socket.on('news', function(data) {
console.log("-- client -- inside socket.on 'news' callback");
console.log(data);
//socket.emit('my other event', { my: 'data' });
});
}

</script>
</head>

<body>
<h1>Socket.io How-to-use Example Script</h1>
<input type='button' id='myButton' value='click me!'/>
</body>
</html>

有人知道如何解决这个问题吗?非常感谢。

最佳答案

我有一个类似的设置正在运行,并且必须在 Node Express Web 服务器上配置以下 header 。

app = require('express')();
...
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET, OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type');
return next();
});

关于node.js - 无法创建到 Node.js socket.io 服务器的跨域 websocket 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20093070/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com