在控制器中使用Socket.IO [英] Use socket.io in controllers

查看:26
本文介绍了在控制器中使用Socket.IO的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果将新对象插入到数据库,我只需要socket.ioemit消息到clients。所以我的想法是直接从我的控制器的insert-method发出消息。在我的server.js文件中,我正在创建socket.io object,并尝试使其可供其他模块访问:

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

//make socket io accessible for other modules
module.exports.io = io;

在我的控制器中,我尝试这样使用Socket.IO:

var io = require('../server').io;
...
io.sockets.on("connection", function(socket){
  passportSocketIo.filterSocketsByUser(io, function (user) {
    return user.workingAt === socket.handshake.user.workingAt;
  }).forEach(function(s){
    s.send("news", insertedObject);
  });
});

我被困在这里了。";Connection&Quot;事件永远不会触发,因此不会发出消息。这是在separate文件中使用socket.io的正确方式吗?很遗憾,我找不到复杂的socket.io示例。

推荐答案

您正在尝试反转控制流。方法是让您的控制器实现一个接口(API),您的服务器可以使用该接口将控制传递给它。

举个简单的例子:

位于mycontroller.js

// no require needed here, at least, I don't think so

// Controller agrees to implement the function called "respond"
module.exports.respond = function(socket_io){
    // this function expects a socket_io connection as argument

    // now we can do whatever we want:
    socket_io.on('news',function(newsreel){

        // as is proper, protocol logic like
        // this belongs in a controller:

        socket.broadcast.emit(newsreel);
    });
}

现在位于server.js

var io = require('socket.io').listen(80);
var controller = require('./mycontroller');

io.sockets.on('connection', controller.respond );

这个示例很简单,因为控制器API看起来与Socket.IO回调完全一样。但是,如果您想要将其他参数传递给控制器,该怎么办呢?像io对象本身还是表示端点的变量?要做到这一点,你需要多做一点工作,但不是很多。这基本上与我们经常用来打破或创建闭包的技巧相同:函数生成器:

位于mycontroller.js

module.exports.respond = function(endpoint,socket){
    // this function now expects an endpoint as argument

    socket.on('news',function(newsreel){

        // as is proper, protocol logic like
        // this belongs in a controller:

        endpoint.emit(newsreel); // broadcast news to everyone subscribing
                                     // to our endpoint/namespace
    });
}

现在在服务器上,我们需要多做一点工作才能通过端点:

var io = require('socket.io').listen(80);
var controller = require('./mycontroller');

var chat = io
  .of('/chat')
  .on('connection', function (socket) {
      controller.respond(chat,socket);
  });
请注意,我们直接传递了socket,但是通过闭包捕获了chat。这样,您就可以拥有多个端点,每个端点都有自己的控制器:

var io = require('socket.io').listen(80);
var news_controller = require('./controllers/news');
var chat_controller = require('./controllers/chat');

var news = io
  .of('/news')
  .on('connection', function (socket) {
      news_controller.respond(news,socket);
  });

var chat = io
  .of('/chat')
  .on('connection', function (socket) {
      chat_controller.respond(chat,socket);
  });

实际上,您甚至可以为每个端点使用多个控制器。请记住,除了订阅事件之外,控制器不做任何事情。执行侦听的是服务器:

var io = require('socket.io').listen(80);
var news_controller = require('./controllers/news');
var chat_controller = require('./controllers/chat');

var chat = io
  .of('/chat')
  .on('connection', function (socket) {
      news_controller.respond(chat,socket);
      chat_controller.respond(chat,socket);
  });

它甚至适用于纯Socket.IO(无端点/命名空间):

var io = require('socket.io').listen(80);
var news_controller = require('./controllers/news');
var chat_controller = require('./controllers/chat');

io.sockets.on('connection', function (socket) {
    news_controller.respond(socket);
    chat_controller.respond(socket);
});

这篇关于在控制器中使用Socket.IO的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆