我使用socket.io并需要导出io对象以便在其他文件中使用。控制器A工作并成功发出消息。奇怪的是,控制器B和C没有正确引用.io
。引用.io
的三种方式之间有什么区别吗?
// index.js
exports.register = function (server, options, next) {
var onlineUsers = {};
var io = require('socket.io')(server.select('collaboration').listener);
io.on('connection', function (socket) {
socket.on('is_online', Handlers.is_online.bind(null, socket));
socket.on('disconnect', Handlers.is_offline.bind(null, socket));
});
exports.io = io;
next();
};
// controllerA.js
var io = require('./collaboration/index');
function testFunc() {
io.io.emit('testing', {data: 'some data'});
}
// controllerB.js
var io = require('./collaboration/index').io;
function testFunc() {
io.emit('testing', {data: 'some data'});
}
// controllerC.js
var index = require('./collaboration/index');
var io = index.io;
function testFunc() {
io.emit('testing', {data: 'some data'});
}
答案 0 :(得分:1)
这与时间有关:exports.io
仅在调用register()
时创建。在此之前,exports.io
未定义。
这也反映在您的控制器中:
controllerA
存储对exports
index.js
对象的引用。当您需要index.js
时,exports.io
尚不存在,但这不是问题,因为您稍后会在testFunc
中引用它( 意味着必须在register()
之前调用testFunc
,否则io.io
仍然未定义); controllerB
时,controllerC
和exports.io
直接引用require
。那时候,它还不存在。换句话说,他们正在存储一个未定义的引用,因此他们的testFunc
失败了; 以下是对正在发生的事情的简化:
// controllerA
var obj = {};
var io = obj;
obj.io = 'hello';
console.log(io.io);
// controllerB
var obj = {};
var io = obj.io;
obj.io = 'hello';
console.log(io);
// controllerC
var obj = {};
var index = obj;
var io = index.io;
obj.io = 'hello';
console.log(io);
此日志:
hello
undefined
undefined