2015-04-23 32 views
1

我的REST調用和一些數據庫插入我想通過socket.io這樣發射到前端新的通知後:獲取socket.io命名空間從項目的任何地方

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

由於我」功能這樣做是通過REST觸發的,而不是通過socket.io觸發的。我沒有變量'socket'。

我開始還以爲我可以得到「IO」像:

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

從這裏,我想我能得到這樣的命名空間:

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

但IO似乎是不確定的(或如果我使用它的端口3000我得到EADDRINUSE,因爲顯然socket.io連接到127.0.0.1:3000

這可能是一個非常愚蠢的問題,但因爲我無法弄清楚m您擁有:我如何才能使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 

SOLUTION

我找到了解決辦法,雖然我不明白爲什麼這是之前的一個問題:我將module.exports.getIO = function()移到底部,現在它工作得很好。雖然我認爲在socketIoListener.js內的位置並不重要,但它顯然沒有。

回答

1

您將不得不通過導出或模塊方法調用的某種組合共享單個服務器端io變量到其他模塊。

一旦你有套接字。IO聽者這樣初始化:

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

您需要與想要使用socket.io其他模塊共享特定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); 

在你只是想使用「已初始化」 IO其他模塊,你可以這樣做:

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

我試過你的解決方案並將其添加到主題中,但不幸的是它不適用於我。你能告訴我我做錯了什麼嗎?謝謝您的幫助! – Markus

+0

@Markus - 你需要這個路徑到你自己的模塊:'var io = require(「你的模塊的路徑」)。getIO();'。我的答案有一個我現在修正的錯字。僅供參考,對於節點模塊來說,相對路徑非常棘手。因此,您需要確保所有模塊都能正確找到。另外,我想知道爲什麼你拿出有用的錯誤信息並用ERR代替它們。這不會告訴某人使用這些他們做錯了什麼或錯誤來自哪裏。 – jfriend00

+0

我只是縮短了答覆,在我的代碼中我仍然有錯誤消息。 (io = require(「path to your module」))。 ioServer.getIO();'應該這樣做。至少這就是我通常從其他文件導入東西的方式。路徑是正確的,我只是雙重檢查它。還有什麼我可能會失蹤? – Markus