如何在最新的mean.io中使用socket.io?

6
我已经获取了最新的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房间设置?

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

9
你可以设置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使用这个项目来进行依赖注入: 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>

1

我刚刚回复了另一个stackoverflow的帖子 (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版本,因为旧的meanio版本中没有http对象(express服务器)。此外,如果您想使用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

最后,使用路由文件定义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的问题,这在之前是不支持的。 - Digitrance

0

看起来mean.io的团队最近发布了一个官方的Socket.io实现,可以直接与他们的堆栈集成。在Github上查看。


0

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

meanio包现在是引导功能所在的位置,同时也是从中调用express设置的位置。


3
这个有任何更新吗,还是你还在确保它完全工作?顺便说一句,谢谢! - Léo Lam
进展:http://www.reddit.com/r/node/comments/29pr64/how_to_combine_meanio_and_socketio/... - mike james

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接