【问题标题】:Hapi.js with Socket.io -- Where is socket.io.js?Hapi.js 和 Socket.io——socket.io.js 在哪里?
【发布时间】:2013-08-23 00:05:04
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 为 hapi 示例+1

标签: node.js socket.io hapijs


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案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 将允许您通过这样的聊天在服务器上做一些很酷的事情:

      server.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) {
                 ...
              });
              ...     
         });
      }
      

      【讨论】:

      【解决方案4】:

      答案:从 CDN 加载客户端脚本

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

      离线工作 ...? (或者不想使用 CDN?

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

      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

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

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

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

      它与最新版本的 Hapi & Socket.io 保持同步,并使用 Redis Pub-Sub 来持久化和分发聊天消息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-10
        • 2017-02-02
        • 2012-12-24
        • 2013-05-21
        • 2013-07-18
        • 1970-01-01
        • 2021-02-27
        相关资源
        最近更新 更多