私はexpress/nodejs apiを持っています。私はsocket.io機能をそれに追加しています。現在、私のルートはすべて別のフォルダーにあり、server.jsファイルに含めて、app.use()関数として使用しています。
Server.jsファイルでは、以下のように3000などの特定のポートをリッスンしてExpressサーバーも起動します。
let server = app.listen(3000);
すべてのグーグル検索によると、私が見つけたのは、次のようにsocket.ioを初期化するためにサーバー変数を渡す必要があるということです。
let io = require('socket.io')(server);
今問題は、この変数が必要なので、異なるフォルダーにあるルートファイルでsocket.ioを使用してクライアントからイベントを発行および受信するにはどうすればよいですか?
[〜#〜]更新[〜#〜]
server.jsファイル内
let route = require('./routes/route');
let app = express();
let server = app.listen(3000);
console.log('Listening to port');
let io = require('socket.io')(server);
app.use('/api/1.0/events', route(io));
route.jsファイル内
let express = require('express');
module.exports = (io) => {
console.log('IO: ', io);
};
更新2
server.jsファイル
let express = require('express');
let events = require('./routes/events');
let app = express();
let server = app.listen(3000);
let io = require('socket.io')(server);
app.use(function(request, response, next) {
request.io = io;
next();
});
app.use('/events', events);
events.jsファイル
let express = require('express');
let Events = require('../models/events');
apiRoutes.post('/new', function(request, response) {
let newEvent = new Events(request.body);
newEvent.save((error, result) => {
if (error) {
response.json(error);
} else {
// console.log('ELSE');
// request.io.on('connect', socket => {
// console.log('LISTENING TO SOCKET...');
request.io.on('EventCreated', data => {
console.log('DATA ON Server: ', data);
});
// });
response.json({
success: true,
message: 'New event created'
});
}
});
});
io
変数をルートファイルと共有する方法は複数あります。
ルートファイルでrequire()
を使用する場合は、コンストラクターの引数としてio
変数を渡します。
app.set("io", io)
を使用すると、app
オブジェクトにアクセスできるすべてのファイルでlet io = app.get("io")
を使用できます。
すべてのio
オブジェクトにreq
オブジェクトを配置するミドルウェアを作成して、いつでもそこからアクセスできるようにします。
これをコンストラクター引数としてルーターファイルに渡す例を次に示します。
_let server = app.listen(3000);
let io = require('socket.io')(server);
// load other routers
app.use(require("./someRouterFile.js")(io));
// in someRouterFile.js
const express = require('express');
module.exports = function(io) {
let router = express.Router()
// define routes
// io is available in this scope
router.get(...)
return router;
}
_
app.set()
スキームの例を次に示します。
_let server = app.listen(3000);
let io = require('socket.io')(server);
app.set("io", io);
_
次に、app
オブジェクトにアクセスできるルート内の任意の場所で、次のようにして取得できます。
_let io = app.get("io");
_
ミドルウェアを使用してio
オブジェクトをすべてのreq
オブジェクトに設定し、すべてのルートから利用できるようにする例を次に示します。
_let server = app.listen(3000);
let io = require('socket.io')(server);
// place this middleware before any other route definitions
// makes io available as req.io in all request handlers
app.use(function(req, res, next) {
req.io = io;
next();
});
// then in any express route handler, you can use req.io.emit(...)
_
ミドルウェアなしでモジュールコンストラクターに引数を使用する例を次に示します。
_// in mysocket.js
module.exports = (io) => {
console.log('IO: ', io);
io.on('connect', socket => {
// handle various socket connections here
});
// put any other code that wants to use the io variable
// in here
};
_
次に、メインファイルで:
_let server = app.listen(3000);
let io = require('socket.io')(server);
// initialize my socketio module and pass it the io instance
require('./mysocket.js')(io);
_
Server.js:
module.exports.getIO = function(){
return io;
}
あなたのルートファイルで:
var theServer = require('<path to server.js>');
var iovar = theServer.getIO(); //your io var