2013-08-01 5 views
0

Сейчас у меня есть следующий код: fooобжиг socket.emit() по запросу HTTP

sIo.sockets.on('connection', function(socket){ 
    socket.emit('hello', 'world'); 
}); 

Я хотел бы быть в состоянии излучать это, когда кто-то открывает страницу из моих маршрутов, например:

//app.js 
app.get('/send', routes.index); 

//routes.js 
exports.index = function(req, res){ 
    socket.emit('hello', 'world'); 
}; 

Как я могу это достичь? Заранее спасибо

+0

Вы пытаетесь испустить все подключенные сокеты или к определенному гнезду? –

+0

пока я просто соглашусь на всех, я так новичок во всем узле. –

ответ

1

Чтобы отправить сообщение сокета во все подключенные сокеты, вы можете просто вызвать io.sockets.emit вместо socket.emit. Существует несколько способов отправки сообщений с использованием socket.io, которые я опишу ниже.

// Send the message to all connected clients 
io.sockets.emit('message', data); 

// Send the message to only this client 
socket.emit('message', data); 

// Send the messages to all clients, except this one. 
socket.broadcast.emit('message', data); 

Существует также концепция комнат, которые вы можете использовать для сегментации своих клиентов.

// Have a client join a room. 
socket.join('room') 

// Send a message to all users in a particular room 
io.sockets.in('room').emit('message', data); 

Все, что охватывает как отправлять сообщения, но теперь ясно, что вы спрашиваете о том, как получить доступ к сокет и/или Io объекты внутри отдельного файла. Один из вариантов позволяет передать эти зависимости указанному файлу. Ваша строка запроса будет выглядеть примерно так.

var routes = require('./routes')(io);

Где Ио объект socket.io создан из .listen. Чтобы обработать это в файле маршрута, вам придется изменить способ определения вашего экспорта.

module.exports = function(io) { 
    return { 
    index: function(req, res) { 
     io.sockets.emit('hello', 'world'); 
     res.send('hello world'); 
    } 
    }; 
} 

Более чистая реализация приведет к тому, что ваши маршруты выведут события, к которым может привязать код сокета. Следующее непроверено, но должно быть очень близко.

var util = require("util"), 
    events = require("events"); 

function MyRoute() { 
    events.EventEmitter.call(this); 
} 

util.inherits(MyRoute, events.EventEmitter); 

MyRoute.prototype.index = function(req, res) { 
    this.emit('index'); 
    res.send('hello world'); 
} 

module.exports = new MyRoute(); 

А затем в файле app.js, когда вы связываете экспресс-маршруты и socket.io.

app.get('/send', routes.index); 

routes.on('index', function() { 
    io.sockets.emit('hello', 'world'); 
}); 

Существует много других способов достижения этого, но лучший из них зависит от того, что вы пытаетесь сделать. Как я уже упоминал ранее, вызывать трансляцию для всех будет гораздо проще, чем трансляция для конкретного пользователя.

+3

вопрос другой. как я могу вызвать 'socket.emit ('hello', 'world'),' 'inside export.index = function (req, res) {};'? –

Смежные вопросы