10

我正在尝试将 socket.io 连接到 Hapi.js 服务器。我已经在 vanilla Node.js 中测试了 socket.io 的实现,一切都很好;Hapi 实现的服务器端似乎工作正常,但“/socket.io/socket.io.js”资源不提供给客户端。

我检查了Hapi 示例,但它们只显示了在服务器上做什么,而且他们关于客户端握手的文档似乎很奇怪:他们在端口 8000 上有一个服务器,但说要发布到 8080 的 socket.io 握手 -我什至尝试过这个(这似乎很不稳定并且与所有其他 socket.io 实现不一致)但没有运气。

谢谢!

4

4 回答 4

3

Hapi 8 引入了一些新的复杂性,所以如果有人重新审视这个问题......

在客户端,您不必使用/socket.io/socket.io.js,而是使用

  1. 一个cdn ( https://cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.16/socket.io.min.js)
  2. 或更具体地提供文件 ( http://yoursite.io/js/socket.io/socket.io.js)
  3. 更好的是,使用类似 npm/browserify 和(https://www.npmjs.com/package/socket.io-client)的东西:

    var socket = require('socket.io-client')('http://localhost:8080');

无论您选择哪种方式包含上面的客户端代码

Hapi 8 将允许你在你的服务器上通过这样的聊天做一些很酷的事情:

服务器.js

server.connection({ port: 8000, labels: 'app' });
server.connection({ port: 8080, labels: 'chat' });
server.register({
    register: require('./server/plugins/socketIO')
}, 
function(err) {
    if (err) throw err;
});

/plugins/socketIO/index.js

exports.register = function(server, options, next) {
    var io = require('socket.io').listen(server.select('chat').listener,{log:false});
    io.sockets.on('connection', function (socket) {
        socket.on('someAction', function(name, cb) {
           ...
        });
        ...     
   });
}
于 2014-12-25T01:39:32.770 回答
3

答:从 CDN 加载客户端脚本

回答您的具体问题:我们决定socket.io.js从 CDN 加载脚本(例如:http ://cdnjs.com/libraries/socket.io )以加快我们的应用程序加载速度。见:index.html#L23

离线工作...?(还是宁愿不使用 CDN?

如果由于您正在拨号或离线工作而无法从 CDN 加载客户端脚本,请使用惰性并将文件公开给您的应用程序。例如:

var Hapi = require('hapi');
var server = new Hapi.Server();

server.connection({
    host: '0.0.0.0',
    port: Number(process.env.PORT || 3000)
});
// uses https://github.com/hapijs/inert to serve static files
server.register(require('inert'), function () {

    server.route([
      { method: 'GET', path: '/', handler: { file: "index.html" } },
      { method: 'GET', path: '/socket.io.js', handler: { file: './node_modules/socket.io-client/socket.io.js' }
    ]);

    server.start(function () {
      console.log('Visit: http://127.0.0.1:'+server.info.port);
    });

});
module.exports = server;

客户端文件位于:your_project/ node_modules/socket.io-client/socket.io.js

具有端到端测试的最新解决方案/示例

如果您仍在寻找如何Hapi.js 应用程序中使用 Socket.io 的示例,我们创建了一个完整的示例(带有文档/评论和端到端测试)。

见:https ://github.com/dwyl/hapi-socketio-redis-chat-example

构建状态 codecov.io 的测试覆盖率 代码气候 依赖状态 dev依赖状态 它与最新版本的 Hapi & Socket.io 保持同步,并使用 Redis Pub-Sub 来持久化和分发聊天消息。

于 2015-11-23T17:06:57.363 回答
0

我首先要确认您没有任何干扰请求服务的防火墙问题。

如果防火墙不负责阻止请求,请确保 javascript 文件的 src 指向相同的服务器和端口号,如 Hapi.createServer 行所示,您已配置。

如果请求到达服务器,它将在终端中输出一条调试行,指示它为文件提供服务。

于 2013-08-27T21:40:07.943 回答
0

您可以尝试将 socket.io.js 文件从 node.js 目录复制到一个众所周知的目录。

于 2013-08-27T09:38:43.827 回答