2016-04-17 12 views
1

私は少し混乱しています。NodeJS、socketIO、複数のファイル

NodeJSアプリでsocketIOを使いたいです。 は、私は、この(擬似)コードを作成しました:

//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'); 
}); 

すべてが正常です。しかし!

今、別のファイルでイベントを発行したいと思います。 ルータとPOSTリクエストがあります。私はPOSTリクエスト(リクエストハンドラは別のファイルにある)でイベントを出したい。

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

サーバを起動する前にルータを初期化する必要がありますが、サーバをIOに渡す必要があります。どのようにIOをルータに渡すのですか?

+0

あなたのルートコールバックから、接続されているすべてのクライアントにイベントを発するようにしたいですか? – jahnestacado

答えて

2

あなたはすべての接続されたクライアントを '通知' にしたい場合は、このソリューションが動作します。この

//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; 
); 

を試すことができます。

特定のクライアントにのみ通知する必要がある場合は、これらのイベントを通信したり、複数のファイルにまたがってソケットインスタンスを共有したりすることは避けてください。あなたのような何かを行うことができますrouter.jsで

+0

接続はOKですが、router.js ioでは定義されていません... – IceManSpy

+0

ありがとう、それは動作します!それはもっと簡単だろうと思った。おそらく私はsocketIOを使いやすくするためにプロジェクトを再構築しなければならないでしょう。 – IceManSpy

0

//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);