我意识到在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?
答案 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)