从导出的模块触发socket.emit

我正试图按照帕特里克·罗伯茨(Patrick Roberts)在这个页面上给出的指示:

如何将socket.io导出到nodejs中的其他模块?

在我的consumer.js当我调用socket.emit('消息')我得到一个错误回来:“不能读取属性'发射'空”

为什么排放不适合我?

这里是我的代码:io.js文件(在中间件目录中)

var socketIO = require('socket.io'); var io = null; exports.io = function() { return io; }; exports.initialize = function(server) { io = socketIO(server); io.on('connection', (socket) => { console.log('user connected') socket.emit('newMessage'); socket.on('hello', (msg) => { console.log('message: ' + msg); }); socket.on('disconnect', () => { console.log('user disconnected'); }); }); }; 

在app.js中我需要的io文件:

 var io = require('./middleware/io').initialize(server); 

在我的consumer.js中,我有以下几点:

 var socket = require('../middleware/io').io(); 

然后从我正在调用的函数中:

 socket.emit('message') 

来自io.js文件内的发射正在工作 – 我试图在consumer.js中使用的那些不是。

这行代码:

 var io = require('./middleware/io').initialize(server); 

加载你的模块,调用模块上的.initialize(server)方法,然后将.initialize(server)的返回值.initialize(server)你的iovariables。 但是,你的.initialize()方法确实会返回任何东西,所以你的iovariables将是undefined

你可以修复,我添加一个返回值的.initialize()方法:

 exports.initialize = function(server) { io = socketIO(server); io.on('connection', (socket) => { console.log('user connected') socket.emit('newMessage'); socket.on('hello', (msg) => { console.log('message: ' + msg); }); socket.on('disconnect', () => { console.log('user disconnected'); }); }); // return the socket.io instance so caller can use it return io; }; 

或者,也可以改变这个:

 var io = require('./middleware/io').initialize(server); 

对此:

 var ioModule = require('./middleware/io'); ioModule.initialize(server); var io = ioModule.io();