首页 > 解决方案 > 将 mongodb 导出到另一个文件的模块 - 这是正确的方法?(在 nodejs 中)

问题描述

我在db.js中有这段代码:

const mongoClient = require('mongodb').MongoClient;

const dotenv = require("dotenv");
dotenv.config();
const mongoDbUrl = process.env.CONNECTIONSTRING;


mongoClient.connect(mongoDbUrl, { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => {
  module.exports = db;
});

然后我想将它添加到文件User.js

const mydb = require("../db");
console.log(mydb);

,但我得到一个空对象:

{}

使 User.js 接收 mydb 的正确代码是什么?

顺便说一句,db.js 中的控制台日志记录数据库返回我需要的内容。

标签: node.jsmongodbrequiremodule.exports

解决方案


请求是同步的,而连接是异步的。它最终会在那里,但你应该做的是导出一个具有异步 init 函数的对象,然后在启动期间调用它,以确保你运行的其余代码在那之后发生。本质上,您不应“运行”模块中的任何代码,而应仅导出值。

// db.js
const mongoClient = require('mongodb').MongoClient;
const dotenv = require("dotenv");

class Db {
  async init() {
    dotenv.config();
    const mongoDbUrl = process.env.CONNECTIONSTRING;
    this.db = await mongoClient.connect(mongoDbUrl, { useNewUrlParser: true, useUnifiedTopology: true }
  }
}
module.exports = new Db()

然后在您的调用代码中:

// main.js
const db = require('./db')
const app = require('./app')

async function main() {
  await db.init()
  await app.run()
}

main().then(() => console.log('done.')).catch(console.error)

推荐阅读