Node.js 重构Express和SocketIO应用程序

Node.js 重构Express和SocketIO应用程序,node.js,express,socket.io,Node.js,Express,Socket.io,我意识到有类似的问题,但我找不到一个对我有帮助的。我有一个ExpressJS4应用程序,我也在使用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 route

我意识到有类似的问题,但我找不到一个对我有帮助的。我有一个ExpressJS4应用程序,我也在使用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;
var api = function(server){
    var ctrlPosts = require('../controllers/posts')(server);
}
var routesApi = require('./server/routes/api')(server);
我有
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?
}
问题
如何从posts控制器访问SocketIO?

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

var controller = function(server){
    var io = require('socket.io')(server);
    var module = {
        create : function(req, res) {...}
    }
    return module;
}
与此类似,您可以将routes api设计为接受服务器参数和call posts控制器,如下所示:

// 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;
var api = function(server){
    var ctrlPosts = require('../controllers/posts')(server);
}
var routesApi = require('./server/routes/api')(server);
并且需要这样的api:

// 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;
var api = function(server){
    var ctrlPosts = require('../controllers/posts')(server);
}
var routesApi = require('./server/routes/api')(server);

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

var controller = function(server){
    var io = require('socket.io')(server);
    var module = {
        create : function(req, res) {...}
    }
    return module;
}
与此类似,您可以将routes api设计为接受服务器参数和call posts控制器,如下所示:

// 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;
var api = function(server){
    var ctrlPosts = require('../controllers/posts')(server);
}
var routesApi = require('./server/routes/api')(server);
并且需要这样的api:

// 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;
var api = function(server){
    var ctrlPosts = require('../controllers/posts')(server);
}
var routesApi = require('./server/routes/api')(server);

在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)

在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)

谢谢,这很有用-我将
io
server.js
传递到
api.js
文件,然后传递到posts控制器。谢谢,这很有用-我将
io
server.js
传递到
api.js
文件,然后传递到posts控制器。