这是我的简单Express App的文件结构。
server/
|- models
|--- users.js
|- index.js
index.js
是入口点
const app = require('express')();
const Server = require('http').createServer(app)
const io = require('socket.io')(Server);
......
.....
.....
.....
....
module.exports = {
Server,
io
}
在我的models/users.js
内部,我需要上面导出的io
变量,以便在添加新用户时向所有已连接的客户端发射一些事件。为此,我导入
const { io } = require('../index');
但是io
是undefined
。我尝试了其他几种类似的方式
const io = require('../index').io //
和
const io = require('../').io /index is useless on require
,但没有人起作用。我是愚蠢的还是我在这里错过了什么。任何帮助都将不胜感激。
谢谢
这是:
的问题以正确的顺序导入
slawitdev对线const socketIOEvents = require('./socketIOEvents');
是问题的一部分。
这是一个实例化users.js
的文件。关于users.js
的实例化,您将在实例化的过程中包括您是的文件。换句话说,我们没有在index.js
中的代码行的底部,以将io
对象导出到该文件。
index.js
->socketIOEvents/index.js
->models/index.js
, - >models/users.js
检查订单
我已经在这些文件的顶部添加了一行代码,以在被调用时登录,然后在index.js
文件中的module.exports
之前添加了一行:
[nodemon] starting `node server`
index.js
socketIOEvents/index.js
models/index.js
models/users.js
Initializing routes
index.js module.exports assignment
Server is running on port 9000.
如您所见,user.js
在之前被称为我们导出模块。
检查导入对象
由于上一个问题的结果,如果我们在users.js
中添加此行:
const test = require('../index');
console.log('test', test);
我们获得输出:
test {}
这意味着我们导入的对象没有任何键,因此执行对象破坏您在以下位置拉出io
键
const { io } = require('../index');
不起作用。
解决方案:
如果我们将module.exports
线和const io
中的CC_21行移动到上述socketioevents,您会发现它开始起作用:
...
const config = require('./config');
// start socket.io
const io = require('socket.io')(Server);
module.exports = {
Server,
io
};
const socketIOEvents = require('./socketIOEvents');
...
注意,这可能是 antipattern ,而不是最终解决方案,因为模块通常在文件的末尾。
替代解决方案:
将
。io
通过socketioevents传递到模型,就像将其传递给socketioevents文件一样,将其传递到函数中。实例
中使用此引用io
在单独的文件中传递到其中。在主index.js
文件和users.js
文件
如果您有节点6 (ES6(此
const { io } = require('./../index');
应该工作。在重新启动之前,先获取当前目录。
编辑1:
我已经对您的代码进行了一些测试。
我几乎确定它不起作用,因为在server/index.js
的这条线(10(中 const socketIOEvents = require('./socketIOEvents');
您需要模型[users.js]但const io在下面(第23行(。
在用户中。并放置文件。test.js中的模块文件夹中的内容:
// testing different import
const { io, Server } = require('./../index');
const io2 = require('./../index').io;
const io3 = require('./../').io
console.log('io', io); // working
console.log('io2', io2); // working
console.log('io3', io3); // working
然后
您只是在存在之前尝试使用变量。