在另一个文件上导入时,模块会变得不确定



这是我的简单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');

但是ioundefined。我尝试了其他几种类似的方式

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

然后

您只是在存在之前尝试使用变量。

最新更新