0

请帮忙!!

我使用 socket.io 能够路由我的套接字。我遇到的问题是,在我的常规 POST 回调中,我需要将结果发送给一个组

req.io.room(room).broadcast('task', req.body)

但由于它是一个常规的 post 方法,所以存在 io 对象。

我尝试像这样使用路由转发

exports.callback = function(req,res){
 req.io.route('emitTask')
};

exports.emitTask= function(req){
   req.io.room(room).broadcast('task', req.body);
};

但是那里存在 io 对象。

我的路由看起来像这样。

app.post('/callback/:customer/:id', socket.callback);
app.io.route('emitTask', socket.emitTask);

有没有人有任何建议如何解决这个问题。

//K

4

1 回答 1

1

您会通过以下io方式获得对象:

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

您需要以某种方式到达该对象才能执行以下操作:

io.sockets.in(room).emit('emitTask');

您可以将其作为单例提供:

// sockets.js
var io = ...;

exports.sendRoom = function (room, message) {
  io.sockets.in(room).emit(message);      
};

// routes/index.js
var sockets = require('./sockets');

app.post('/callback/:customer/:id', function (req, res) {
  sockets.sendRoom('myroom', 'emitTask');
  res.send(200);
});

一个更具可扩展性的解决方案是在您的应用程序中引入总线:一个全局事件发射器,它跨模块调度事件:

// bus.js
module.exports = new require('events').EventEmitter();

// sockets.js
var bus = require('./bus'),
    io = ...;

bus.on('sendRoom', function (room, message) {
  io.sockets.in(room).emit(message);      
});

// routes/index.js
var bus = require('./bus');

app.post('/callback/:customer/:id', function (req, res) {
  bus.emit('sendRoom', 'myroom', 'emitTask');
  res.send(200);
});
于 2013-11-05T16:44:33.980 回答