这是我的简单Express应用程序的文件结构。
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
但没有效果。 我是傻还是我在这里想念一些东西。 任何帮助都将受到高度赞赏。
由于
答案 0 :(得分:2)
这是一个问题:
SlaWitDev关于const socketIOEvents = require('./socketIOEvents');
行是该问题的一部分是正确的。
这是一个实例化users.js
的文件。在users.js
的实例化时,您将在实例化的过程中包含您的文件。换句话说,我们没有触及index.js
中代码行的底部,因为它将io
对象导出到该文件。
index.js
- > socketIOEvents/index.js
- > models/index.js
, - > models/users.js
我在这些文件的顶部添加了一行代码,以便在调用它们时进行记录,然后在module.exports
文件中的index.js
之前添加一行:
[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
行和index.js
行移到socketIOEvents以上,您会看到它开始工作:
...
const config = require('./config');
// start socket.io
const io = require('socket.io')(Server);
module.exports = {
Server,
io
};
const socketIOEvents = require('./socketIOEvents');
...
请注意,这可能是反模式而不是最终解决方案,因为module.exports通常位于文件的末尾。
将io
传递给socketIOEvents中的模型,就像将它传递给socketIOEvents文件一样,将它作为参数传递给函数。
实例io
位于单独的文件中,其中传递了Server。在主index.js
文件和users.js
文件
答案 1 :(得分:-1)
如果你有节点6+(ES6)这个
const { io } = require('./../index');
应该有效。 在进入reqiure之前,先获取当前目录。
修改1:
我已经对您的代码进行了一些测试。
我几乎可以肯定,它不起作用,因为server/index.js
的这一行(10)
const socketIOEvents = require('./socketIOEvents');
你需要模型[users.js]
但
const io在下面(第23行)。
在users.js评论第9行 并把文件放在例如。带有内容的模块文件夹中的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
然后节点服务器/ models / test.js 并要求(' ./../ index')正常工作
您只是在存在之前尝试使用变量。