【问题标题】:Nodejs include socket.io in router pageNodejs在路由器页面中包含socket.io
【发布时间】:2012-09-12 03:05:10
【问题描述】:

我有一个 express 节点应用程序,我试图通过在 app.js 中不包含所有 socket.io 内容来保持我的代码整洁

我不知道解决这个问题的最佳方法。这是我最初的想法,感觉不是最干净的

// app.js
var express = require('express')
    , app = express()
    , server = require('http').createServer(app)
    , url = require('url')
    , somePage = require('./routes/somePage.js')
    , path = require('path');

    app.configure(function(){...});

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

路线

// somePage.js
    exports.index = function (req, res, server) {
        io = require('socket.io').listern(server)
        res.render('index',{title: 'Chat Room'})

        io.sockets.on('connection', function(socket) {
            ...code...
        }
    }

我觉得我很近,但不是很接近

【问题讨论】:

    标签: node.js express socket.io router


    【解决方案1】:

    我不知道我的理解是否正确,但看起来您正在为/ 的每个请求启动一个套接字服务器,坦率地说,我对此有点惊讶。

    这就是我从 app.js 中分离出 socket.io 代码的方式(使用 express 3.x,它与 2.x 有点不同):

    // app.js
    var express = require('express');
    var app = express();
    
    var server_port = config.get('SERVER_PORT');
    server = http.createServer(app).listen(server_port, function () {
        var addr = server.address();
        console.log('Express server listening on http://' + addr.address + ':' + addr.port);
    });
    
    var sockets = require('./sockets');
    sockets.socketServer(app, server);
    
    
    // sockets.js
    var socketio = require('socket.io');
    exports.socketServer = function (app, server) {
      var io = socketio.listen(server);
    
      io.sockets.on('connection', function (socket) {
        ...
      });
    };
    

    希望有帮助!

    【讨论】:

    • 谢谢。解决了它。这就是我将其应用于最终获得的方式。 app.get('/socket',function(req,res) { socket.socketServer(req,res,app,server) });
    • 感谢您对成功的反馈!我很高兴能帮上忙! :)
    • 我肯定会在 app.get() 之外启动服务器。我添加了上面示例中缺少的一些代码。我建议在app.js 结尾处像上面一样启动服务器。
    • 我的 socket.js 和你的一样,唯一的区别是我替换了你的 'sockets.socketServer(app, server);'符合我的 app.get 声明。这是禁忌吗?
    • 我认为这意味着每次有人访问 /socket 时,您都在设置 socket.io。您只需要启动服务器一次,然后只要您的应用程序保持运行,客户端就可以与它通信。也就是socket.io部分没有连接到具体的view。
    【解决方案2】:

    类似的方法是将app 传递到index.js 文件中并在那里启动http 和socketio 服务器。

    //app.js
    //regular expressjs configuration stuff
    
    require('./routes/index')(app);   //all the app.get should go into index.js
    

    由于app被传递到index.js文件中,我们可以在index.js中做app.get()路由的东西,以及连接socketio

    //index.js
    module.exports = function(app){
    
    var server = require('http').createServer(app)
        ,io = require('socket.io').listen(server);
    
    app.get('/', function(req, res){
     });
    
    server.listen(app.get('port'), function(){
       console.log("Express server listening on port " + app.get('port'));
    });
    
    
    io.sockets.on('connection', function(socket){  
       socket.on('my event', function(data){
       console.log(data);
      });
    });
    
    io.set('log level',1);
    
    //io.sockets.emit(...)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 2015-05-13
      • 2014-10-31
      • 2018-11-24
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多