Node.js将socket.io包含在路由页面中

3

我有一个express node应用程序,我试图通过不在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...
        }
    }

我感觉我接近目标,但还没有完全达到。

2个回答

9

我不确定我是否读懂了,但看起来您正在为/的每个请求启动一个套接字服务器,我很惊讶这个方法居然能够工作。

这是我从app.js中分离socket.io代码的方法(使用的是3.x版本的express,与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) {
    ...
  });
};

希望这有所帮助!

1
谢谢。问题解决了。这是我将其应用于最终获取的方式。app.get('/socket',function(req,res) { socket.socketServer(req,res,app,server) }); - Marius Miliunas
感谢您对成功的反馈!我非常高兴能够提供帮助! :) - lemonad
我肯定会在app.get()之外启动服务器。我已经添加了一些缺失的代码到上面的示例中。我建议只需像我在app.js结尾处所做的那样启动服务器。 - lemonad
我的socket.js与你的完全相同,唯一的区别是我用我的app.get语句替换了你的'sockets.socketServer(app, server);'这一行。这样做是否不妥? - Marius Miliunas
我理解你的意思是每次有人访问“/socket”时都会设置socket.io。实际上,你只需要启动服务器一次,然后客户端可以在应用程序保持运行的情况下与它通信。也就是说,socket.io部分与特定视图没有关联。 - lemonad

1
一个类似的方法是将 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(...)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接