从导出的模块触发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)
你的io
variables。 但是,你的.initialize()
方法确实会返回任何东西,所以你的io
variables将是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();