NodeJS&Socket.io:控制器中的套接字

我有这个代码:

app.js:

'use strict' var express = require('express') , http = require('http') , path = require('path') , app = express() , fs = require('fs') , engine = require('ejs-locals') , io = require('socket.io').listen(3872, {log:true}) , connections = 0; app.set('port', 80); app.set('views', __dirname + '/views'); app.engine('ejs', engine); app.set('view engine', 'ejs'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser('secret')); app.use(express.session()); app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); fs.readdirSync('./controllers').forEach(function (controller) { if(controller.substr(-3) == '.js') { var route = require('./controllers/' + controller); route.controller(app); } }); var server = http.createServer(app).listen(app.get('port'), function(){ console.log('Server runs at port: ' + app.get('port')); }); io.sockets.on('connection', function (socket) { connections++; console.log('New connection['+ connections +'] from ' + socket.handshake.address.address); socket.emit('pingPong'); socket.on('disconnect', function() { connections--; console.log('Lost connection['+ connections +'] from ' + socket.handshake.address.address); }); }); 

/controllers/index.js

 var Model = require('../models/index'); module.exports.controller = function(app) { app.get('/index', function(req, res) { res.redirect('/'); }); app.get('/', function(req, res) { res.render('index', { _: Model }); }); } socket.emit('hoi', { message: 'hi' }); 

是的,我得到的错误“套接字未定义”,我真的期待,但我不知道如何访问控制器中的套接字变种。 有谁知道我怎么可以发送套接字(与socket.io)在控制器?

有很多方法可以做到这一点,想到的最简单的方法就是将io实例传递给控制器​​。

 fs.readdirSync('./controllers').forEach(function (controller) { if(controller.substr(-3) == '.js') { var route = require('./controllers/' + controller); route.controller(app, io); //Pass it here } }); 

您可以在导出function中使用它。

 var Model = require('../models/index'); module.exports.controller = function(app, io) { app.get('/index', function(req, res) { res.redirect('/'); }); app.get('/', function(req, res) { res.render('index', { _: Model }); }); io.on('connection', function(socket) { socket.emit('hoi', { message: 'hi' }); }); }