重构Express和SocketIO应用程序

时间:2016-05-19 10:10:26

标签: node.js express socket.io

我意识到在SO上有类似的问题,但我找不到能帮助我的问题。我有一个Expressjs 4应用程序,我也使用SocketIO。我的server.js文件的片段如下所示:

// server.js
...
var app = express();
var server = require('http').createServer(app).listen(process.env.PORT || 8080);
var io = require('socket.io')(server);

var routesApi = require('./server/routes/api');

module.exports = app;

我有api.js

// server/routes/api.js
...
var ctrlPosts = require('../controllers/posts');
router.post('/posts', ctrlPosts.create);
...

和我的帖子控制器:

// controllers/posts
module.exports.create = function(req, res) {
  //how can I access io from here?
}

问题 如何从我的帖子控制器访问SocketIO?

2 个答案:

答案 0 :(得分:1)

您可以将posts控制器设计为接受构造函数中的参数。

var controller = function(server){
    var io = require('socket.io')(server);
    var module = {
        create : function(req, res) {...}
    }
    return module;
}

与此类似,您可以设计您的路线api以接受服务器参数并呼叫发布控制器,如下所示:

var api = function(server){
    var ctrlPosts = require('../controllers/posts')(server);
}

并要求api像这样:

var routesApi = require('./server/routes/api')(server);

答案 1 :(得分:1)

在config目录中创建socket.js并导出io

// socket.js
var socketio = require('socket.io')

module.exports.listen = function(app){
    io = socketio.listen(app)

    posts = io.of('/posts')
    posts.on('connection', function(socket){
        socket.on ...
    })

    return io
}

然后在您的控制器中调用它

// controller
var io = require('./config/socket').listen(app)