2015-04-23 8 views
1

После моего REST вызова и некоторые базы данных вставки, которые я хочу, чтобы излучать новое уведомление фронтэнда через socket.io так:Получение Socket.io имен из любого места в проекте

socket.broadcast.emit('send notification', notification); 

Поскольку функция I» m делать это в был вызван через REST, а не через socket.io У меня нет переменной 'socket'.

Я сначала подумал, что я могу просто получить «ю» как:

var io = require('socket.io') // or like: require('socket.io')(3000) 

здесь я думал, что я могу получить пространство имен, как:

var nsp = io.of('/notification-list'); 
nsp.on('connection', function (socket) { ... } 

Но И.О. кажется неопределенным (или если я использую его с портом 3000, я получаю EADDRINUSE, потому что, очевидно, socket.io подключен к 127.0.0.1:3000

Это может быть очень глупый вопрос, y own: Как я могу получить socket, готовый к использованию в этой функции? Любая помощь приветствуется!


редактировать:

Я попытался решение friend00, но я до сих пор не могу понять, о том, как это сделать.

в моем server.js я создаю сервер & импортировать мой socketIO вещи, как это:

var server = 
http.createServer(app).listen(app.get('port'), function() { 
}); 
require('./socketio_listener/socketIoListener')(server); 

тогда мой socketIoListener.js

var sockio = require("socket.io"); 
var io; 

function initIO(server) { 
    if (!server) { throw new Error("ERR"); } 
    if (!io) { 
     io = sockio.listen(server); 
    } 
    return io; 
} 

module.exports.getIO = function() { 
    if (!io) { throw new Error("ERR"); } 
    return io; 
}; 

module.exports = function (server) { 
io = initIO(server); 

var nspNotification = io.of('/notification-list'); 
nspNotification.on('connection', function (socket) { 
    socket.on('get notificationList', function (data) { 
     notification.findNotifications(socket, data); 
    }); 
    // ... 
}); 

теперь я попробовал в функции Я хотел излучать что-то через сокет. io:

var io = require("socket.io").getIO(); 

Я также пробовал:

var ioServer = require('../socketio_listener/socketIoListener'); 
ioServer.getIO(); 

Но я до сих пор всегда получаю:

TypeError: undefined is not a function 

РЕШЕНИЕ

Я нашел решение, хотя я не совсем уверен, почему это было проблемой, прежде чем : Я переместил module.exports.getIO = function() на дно, и теперь он работает отлично. Хотя я думал, что размещение в пределах socketIoListener.js не имело значения, что это явно делало.

ответ

1

Вам придется разделить одну переменную сервера io с другими модулями через некоторую комбинацию вызовов метода экспорта или модуля.

Как только у вас есть гнездо.И.О. слушатель инициализируется так:

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

Вам нужно будет делить конкретный io экземпляр с другими модулями, которые хотят использовать socket.io. Как именно вы его разделяете, зависит от структуры вашего кода и того, где вы пытаетесь поделиться им.


Например, вы могли бы иметь модуль, который только управляемый инициализацию Io:

var sockio = require("socket.io"); 
var io; 

// mysocketio.js 
// constructor function - should only be called once and passed the http server 
module.exports = function(server) { 
    if (!server) { 
     throw new Error("Must pass http server instance to mysocketio module constructor"); 
    } 
    if (!io) { 
     io = sockio.listen(server); 
    } 
    return io; 
}; 

module.exports.getIO = function() { 
    if (!io) { 
     throw new Error("Must call constructor of mysocketio module before getIO()"); 
    } 
    return io; 
}; 

Затем, в одном месте вы инициализировать его с конкретным сервером HTTP, вы можете сделать это :

var io = require("mysocketio")(server); 

в других модулях, где вы просто хотите использовать «уже инициализирован» Ио, вы можете сделать это:

var io = require("mysocketio").getIO(); 
+0

Я попробовал ваше решение и добавил его к теме, к сожалению, это не сработало для меня. Можете ли вы сказать мне, что я делаю неправильно? Спасибо за помощь! – Markus

+0

@Markus - Вам нужен путь к вашему собственному модулю в следующем: 'var io = require (« путь к вашему модулю »). GetIO();'. В моем ответе была опечатка, которую я теперь исправил. FYI, относительные пути сложны, чтобы получить право на узловые модули. Таким образом, вам нужно убедиться, что все модули найдены правильно. Кроме того, мне интересно, почему вы извлекли полезные сообщения об ошибках и заменили их просто ERR. Это не скажет кому-то, кто использует это, что они сделали не так, или откуда исходит ошибка. – jfriend00

+0

Я просто сократил его для ответа, в моем коде у меня все еще есть сообщение об ошибке. как для 'var io = require (« путь к вашему модулю »). GetIO();': 'var ioServer = require ('../ socketio_listener/socketIoListener'); ioServer.getIO(); 'должен делать именно это. По крайней мере, так я обычно импортирую материал из других файлов. Путь правильный, я просто дважды проверил его. Что-нибудь еще, что мне не хватало? – Markus

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