web-dev-qa-db-ja.com

メインのserver.jsファイルではなく、expressjsルートでsocket.ioを使用する

私は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'
            });
        }
    });
});
13
null

io変数をルートファイルと共有する方法は複数あります。

  1. ルートファイルでrequire()を使用する場合は、コンストラクターの引数としてio変数を渡します。

  2. app.set("io", io)を使用すると、appオブジェクトにアクセスできるすべてのファイルでlet io = app.get("io")を使用できます。

  3. すべての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);
_
20
jfriend00

Server.js:

module.exports.getIO = function(){
     return io;
}

あなたのルートファイルで:

var theServer = require('<path to server.js>');
var iovar = theServer.getIO(); //your io var
0
wrangler