- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
根据我的搜索,这不应该那么难,而且到目前为止我已经尝试了很多事情,但都没有成功。我有一个在 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/
我通过 spring ioc 编写了一些 Rest 应用程序。但我无法解决这个问题。这是我的异常(exception): org.springframework.beans.factory.BeanC
我对 TestNG、Spring 框架等完全陌生,我正在尝试使用注释 @Value通过 @Configuration 访问配置文件注释。 我在这里想要实现的目标是让控制台从配置文件中写出“hi”,通过
为此工作了几个小时。我完全被难住了。 这是 CS113 的实验室。 如果用户在程序(二进制计算器)结束时选择继续,我们需要使用 goto 语句来到达程序的顶部。 但是,我们还需要释放所有分配的内存。
我正在尝试使用 ffmpeg 库构建一个小的 C 程序。但是我什至无法使用 avformat_open_input() 打开音频文件设置检查错误代码的函数后,我得到以下输出: Error code:
使用 Spring Initializer 创建一个简单的 Spring boot。我只在可用选项下选择 DevTools。 创建项目后,无需对其进行任何更改,即可正常运行程序。 现在,当我尝试在项目
所以我只是在 Mac OS X 中通过 brew 安装了 qt。但是它无法链接它。当我尝试运行 brew link qt 或 brew link --overwrite qt 我得到以下信息: ton
我在提交和 pull 时遇到了问题:在提交的 IDE 中,我看到: warning not all local changes may be shown due to an error: unable
我跑 man gcc | grep "-L" 我明白了 Usage: grep [OPTION]... PATTERN [FILE]... Try `grep --help' for more inf
我有一段代码,旨在接收任何 URL 并将其从网络上撕下来。到目前为止,它运行良好,直到有人给了它这个 URL: http://www.aspensurgical.com/static/images/a
在过去的 5 个小时里,我一直在尝试在我的服务器上设置 WireGuard,但在完成所有设置后,我无法 ping IP 或解析域。 下面是服务器配置 [Interface] Address = 10.
我正在尝试在 GitLab 中 fork 我的一个私有(private)项目,但是当我按下 fork 按钮时,我会收到以下信息: No available namespaces to fork the
我这里遇到了一些问题。我是 node.js 和 Rest API 的新手,但我正在尝试自学。我制作了 REST API,使用 MongoDB 与我的数据库进行通信,我使用 Postman 来测试我的路
下面的代码在控制台中给出以下消息: Uncaught DOMException: Failed to execute 'appendChild' on 'Node': The new child el
我正在尝试调用一个新端点来显示数据,我意识到在上一组有效的数据中,它在数据周围用一对额外的“[]”括号进行控制台,我认为这就是问题是,而新端点不会以我使用数据的方式产生它! 这是 NgFor 失败的原
我正在尝试将我的 Symfony2 应用程序部署到我的 Azure Web 应用程序,但遇到了一些麻烦。 推送到远程时,我在终端中收到以下消息 remote: Updating branch 'mas
Minikube已启动并正在运行,没有任何错误,但是我无法 curl IP。我在这里遵循:https://docs.traefik.io/user-guide/kubernetes/,似乎没有提到关闭
每当我尝试docker组成任何项目时,都会出现以下错误。 我尝试过有和没有sudo 我在这台机器上只有这个问题。我可以在Mac和Amazon WorkSpace上运行相同的容器。 (myslabs)
我正在尝试 pip install stanza 并收到此消息: ERROR: No matching distribution found for torch>=1.3.0 (from stanza
DNS 解析看起来不错,但我无法 ping 我的服务。可能是什么原因? 来自集群中的另一个 Pod: $ ping backend PING backend.default.svc.cluster.l
我正在使用Hibernate 4 + Spring MVC 4当我开始 Apache Tomcat Server 8我收到此错误: Error creating bean with name 'wel
我是一名优秀的程序员,十分优秀!