Node.js模块导入仅在顶级文件层次结构中有效

时间:2019-06-21 21:18:42

标签: node.js import export es6-modules

我正在使用express和mongoose构建用于中间层服务的graphql服务器,并且具有类似这样的项目结构,

-models
---user.js
---messages.js
---index.js
-resolvers/
-schema/
-index.js

以index.js为切入点。我正在尝试将模块从src / models / index.js导出到src / models / user.js和src / models / messages.js。

我当前正在从src / models / index.js导出一个函数以连接到数据库到src / index.js,这很好用。但是,如果尝试在同一目录(“ models”文件夹)中导入相同的导出文件,则会导致该模块无法访问。

貌似将语法更改为

export function getDatabaseConnections (dbName) {
...
}

可以在src / models / user.js内部获得识别的功能,但是无论导出语法如何,connections变量在文件内部仍然是未定义的。

src / models / index.js

var connections = {};
const connectToDB = () => {
    return mongoose.connect(mongo_uri, { useNewUrlParser: true});
};

const getDatabaseConnections = (dbName) => {
  if(connections[dbName]) {
    return connections[dbName];
  } else {
    // if the connection object doesn't already exist, create and return
    connections[dbName] = mongoose.createConnection(mongo_uri, { useNewUrlParser: true });
    return connections[dbName];
  }
};

const models = { User, Message };

export { connectToDB, getDatabaseConnections, connections };

export default models;

有效地导入src / index.js。

import models, { connectToDB, getDatabaseConnections, connections } from './models';
connectToDB(); // this functions properly
console.log(connections) // functions
getDatabaseConnections('dbName') // functions

在src / models / user.js内

import { connectToDB, getDatabaseConnections, connections } from './index';
connectToDB(); // fails
console.log(connections) // fails
getDatabaseConnections('dbName') // fails

在src / models / message.js内,我收到TypeError:(0,_index.getDatabaseConnections)不是一个函数,但是我希望导入能够像在应用程序的入口处一样正常工作。

1 个答案:

答案 0 :(得分:0)

这是由于对进口商品的循环依赖。 Models / index.js是从models / user.js导入的,但是我试图在user.js内使用index模块。无法保证模块的解析顺序,因此在user.js中显示为空。