2016-04-17 16 views
1

Ich bin ein wenig verwirrt;NodeJS, socketIO, mehrere Dateien

Ich möchte SocketIO auf NodeJS App verwenden. Ich habe diese (Pseudo-) Code erstellt:

//server.js 
var app = express(); 
//some code... 
var router = require('./app/router'); 
app.use(router); 

var server = app.listen(appConfig.app.port, function() { 
    var port = server.address().port; 
}); 
var io = require('socket.io')(server); 
io.on('connection', function (client) { 
    console.log('Client connected...'); 

    client.on('join', function (data) { 
     console.log(data); 
    }); 
}); 


//client.js 
var socket = io.connect('http://localhost:5555'); 
socket.on('connect', function(data) { 
    socket.emit('join', 'Hello World from client'); 
}); 

Alles ist in Ordnung. Aber !

Jetzt möchte ich Ereignis in einer anderen Datei ausgeben. Ich habe Router und POST-Anfrage. Ich möchte Ereignis bei POST-Anfrage ausgeben (Anfrage-Handler ist in einer anderen Datei).

//router.js 
router.route("/addmenu").post(function (req, res) { 
     menuModel.addMenu(req.body,function(data){ 
      //I WANT EMIT HERE 
      res.json(data) 
     }); 
    }; 
); 

Ich habe Router initialisiert werden vor dem Start Server, aber ich habe Server IO passieren ... Wie IO passieren Router?

+0

Haben Sie das Ereignis an alle angeschlossenen Clients von Ihrer Route Rückruf emittieren wollen? – jahnestacado

Antwort

2

können Sie versuchen, diese

//server.js 
var app = express(); 
//some code... 
var io; 
var getIOInstance = function(){ 
    return io; 
}; 
var router = require('./app/router')(getIOInstance); 
app.use(router); 

var server = app.listen(appConfig.app.port, function() { 
    var port = server.address().port; 
}); 

io = require('socket.io')(server); 
io.on('connection', function (client) { 
    console.log('Client connected...'); 

    client.on('join', function (data) { 
     console.log(data); 
    }); 
}); 

//router.js 
module.exports = function(getIOInstance){ 
    router.route("/addmenu").post(function (req, res) { 
     menuModel.addMenu(req.body,function(data){ 
      //I WANT EMIT HERE 
      getIOInstance().sockets.emit(...) 
      res.json(data) 
     }); 
    }; 
    return router; 
); 

Diese Lösung, wenn Sie alle angeschlossenen Kunden benachrichtigen 'wollen arbeiten.

Wenn Sie nur einen bestimmten Client benachrichtigen müssen, rate ich Ihnen, ein Event-Emitter-Modul zu verwenden, um diese Ereignisse zu kommunizieren und Ihre Socket-Instanzen nicht über mehrere Dateien hinweg zu teilen.

+0

Verbindung ist ok, aber in router.js io ist undefined ... – IceManSpy

+0

Vielen Dank, es funktioniert! Ich dachte, das wäre einfacher. Wahrscheinlich muss ich mein Projekt umstrukturieren, um socketIO einfacher zu verwenden. – IceManSpy

0

In router.js Sie können wie etwas tun:

//router.js 
module.exports = function(io) { 
var router = //What you declared it to be 
router.route("/addmenu").post(function (req, res) { 
    menuModel.addMenu(req.body,function(data){ 
     //I WANT EMIT HERE 
     res.json(data) 
    }); 
}; 
); 
return router; 
} 


//server.js 
//Change this line to be like the one below 
var router = require('./app/router'); 
//......... 
//....... 

//Desired way 
var router = require('./app/router')(io);