在另一个文件上导入时,module.exports未定义

时间:2018-03-27 17:37:44

标签: node.js requirejs commonjs

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

ioundefined。 我尝试过其他类似的方法

const io = require('../index').io // 

const io = require('../').io /index is useless on require

但没有效果。 我是傻还是我在这里想念一些东西。 任何帮助都将受到高度赞赏。

由于

2 个答案:

答案 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')正常工作

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