我正在尝试按照Patrick Roberts在此页面上提供的说明进行操作:
How can i export socket.io into other modules in nodejs?
当我调用socket.emit('message')时,在我的consumer.js中我收到一个错误: “无法读取属性'emit'的null”
为什么发射不可用?
这是我的代码: 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中使用它。
答案 0 :(得分:2)
这行代码:
var io = require('./middleware/io').initialize(server);
加载您的模块,调用模块上的.initialize(server)
方法,然后将.initialize(server)
的返回值分配给您的io
变量。但是,您的.initialize()
方法确实会返回任何内容,因此,io
变量将为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();