【问题标题】:How to use socket.io with the latest mean.io?如何将 socket.io 与最新的 mean.io 一起使用?
【发布时间】:2014-09-12 13:30:54
【问题描述】:

我获取了最新的 Mean.io 的副本,并注意到与我之前使用的先前版本相比有很多变化。现在,我正在做的是创建一个非常基本的聊天应用程序,它使用socket.io 和房间。按照 Socket 文档中的基本设置,我必须实现以下内容:

var app = require('express')()
  , server = require('http').createServer(app)
  , io = require('socket.io').listen(server);

server.listen(80);

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

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

我应该在哪里定义基本的插座室设置?

socket.set("log level", 1);  
var people = {};  
var rooms = {};  
var clients = [];  

【问题讨论】:

    标签: node.js chat socket.io mean-stack


    【解决方案1】:

    你可以设置socket.io在你的服务器上监听

    /server/config/system/bootstrap.js
    

    需要socket.io模块

    var express = require('express'),
        appPath = process.cwd(),
        io      = require('socket.io');
    

    现在设置 socket.io 来监听你的应用

    // Express settings
    var app = express(); 
    require(appPath + '/server/config/express')(app, passport, db);
    io = io(app.listen(3000));    
    
    return io;
    

    然后您需要在 bootstrapDependencies() 函数中将 socket.io 对象注入您的应用程序。

    function bootstrapDependencies() {
        ...
    
        // Register socket.io dependency
        mean.register('io', function() {
            return io;
        });
    }
    

    Mean.uses 这个项目进行依赖注入 https://www.npmjs.org/package/dependable

    最后你需要配置你的应用来监听每个套接字连接 可能你想在你的主应用的路由器上做这些

    /server/routes/index.js
    

    示例连接处理程序

    var io = require('meanio').io;
    
    io.on('connection', function (socket) {
        // emit data to the clients
        socket.emit('news', { hello: 'world' });
    
        // event listeners
        socket.on('my other event', function (data) {
             // call your controller function here
             Controller.action(data);
        });
    });
    

    更重要的是,不要忘记在客户端设置 socket.io。

    // on '/server/views/includes/foot.html'
    <script src='/socket.io/socket.io.js'></script>
    <script>
        var socket = io();
    </script>
    

    【讨论】:

      【解决方案2】:

      我刚刚回复了另一个 SO 帖子 (Mean.io framwork with socket.io)。

      注意:我使用的是 mean.io v0.5.26 和 socket.io v1.1.0。

      在这里再次粘贴我的答案。


      我也遇到了同样的问题,我花了大约一周的时间才终于把它弄好。我将尝试解释我的所作所为:

      app.js

      在这个文件中,我只是调用为我创建和设置 socket.io 对象的代码,然后将其传递给路由模块。

      'use strict';
      
      /*
       * Defining the Package
       */
      var Module = require('meanio').Module;
      
      var MeanSocket = new Module('chat');
      
      /*
       * All MEAN packages require registration
       * Dependency injection is used to define required modules
       */
      MeanSocket.register(function(app, http) {
      
          var io = require('./server/config/socketio')(http);
      
          //We enable routing. By default the Package Object is passed to the routes
          MeanSocket.routes(io);
      
          return MeanSocket;
      });
      

      server/config/socketio.js

      这个文件只是简单地配置了 socket.io 对象。请注意,我必须将 meanio 模块升级到 0.5.26 版才能完成这项工作,因为 http 对象(快速服务器)在较旧的 meanio 版本中不可用。此外,如果你想使用 ssl,你可以注入 https 而不是 http

      'use strict';
      
      var config = require('meanio').loadConfig(),
          cookie = require('cookie'),
          cookieParser = require('cookie-parser'),
          socketio = require('socket.io');
      
      module.exports = function(http) {
      
          var io = socketio.listen(http);
      
          io.use(function(socket, next) {
              var data = socket.request;
      
              if (!data.headers.cookie) {
                  return next(new Error('No cookie transmitted.'));
              }
      
              var parsedCookie = cookie.parse(data.headers.cookie);
              var sessionID = parsedCookie[config.sessionName];
              var parsedSessionID = cookieParser.signedCookie(parsedCookie[config.sessionName], config.sessionSecret);
      
              if (sessionID === parsedSessionID) {
                  return next(new Error('Cookie is invalid.'));
              }
      
              next();
          });
      
          return io;
      };
      

      routes/chat.js

      最后使用routes文件定义socket事件等

      'use strict';
      
      // The Package is passed automatically as first parameter
      module.exports = function(MeanSocket, io) {
      
          io.on('connection', function(socket) {
      
              console.log('Client Connected');
      
              socket.on('authenticate', function(data, callback) {
      
              });
          });
      };
      

      希望这会有所帮助!

      【讨论】:

      • 只是想补充一点,这段代码终于变成了官方的mean-socket实现。所以,一定要检查一下!并且解决了之前不支持的在单端口后面部署meanio和mean-socket的问题。
      【解决方案3】:

      最新的更新 v0.4.0 需要另一种策略来设置 socket.io。我目前正在与项目贡献者之一讨论以验证我的解决方案。一旦我 100% 确定,我会确保更新我的回复。

      meanio 包现在是引导功能所在的位置,也是调用快速设置的位置。

      【讨论】:

      【解决方案4】:

      看起来 mean.io 的家伙最近发布了一个官方的 Socket.io 实现,它直接与他们的堆栈集成。看看on Github

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-21
        • 2012-03-07
        • 1970-01-01
        • 1970-01-01
        • 2017-01-24
        • 2017-08-23
        • 2011-09-17
        • 2012-12-21
        相关资源
        最近更新 更多