0

ルートでsocket.ioを使用する際に問題が発生しました。

私のapp.jsで。ルートを指定しました。

app.get('/', routes.index);

ルート用のindex.jsファイルがあります

exports.index = function(req, res){
    res.render('index', { title: 'Example Title' });
    io.sockets.on('connection', function(socket){
    ...
    });
});

ただし、index.jsで「ReferenceError:ioisnotdefined」というエラーが発生し続けます。ioオブジェクトを各ルートに渡す必要がありますか、それとも各ルートにsocket.ioが必要ですか?

4

2 に答える 2

1

これがこの問題のベスト プラクティスであるかどうかはわかりませんが、アプリで socket.io を使用する方法を紹介します。

私の app.js には、次の行があります。

var io = require('socket.io').listen(server, { log: false });
routeRegistrar.init(app, io);

routeRegistrarは、すべてのコントローラーを通過してそのルートを登録するために使用する補助関数です。以下を参照してください。

var fs = require('fs');

var controllersFolder = "controllers";
var controllersFolderPath = __dirname + '/../' + controllersFolder + "/";

module.exports.init = function(app, io){
    fs.readdirSync(controllersFolderPath).forEach(function(controllerName){
        require(controllersFolderPath + controllerName).init(app, io);
    }); 
};

iovar をすべてのコントローラーに伝達するため、すべてのコントローラーで使用できることに注意してください。コントローラーには次のものがあります。

var sockets; //see that this variable becomes global to the controller
module.exports.init = function(app, io) {
    app.get("/chat", chat);

    sockets = io.sockets;
    sockets.on('connection', function(socket) {
        //do any cool stuff here
    });
};

function chat(){
    //sockets is available here, at the route level - so do more cool stuff here
}
于 2012-11-12T13:39:15.367 に答える