繁体   English   中英

在其他模块中未读取从 MongoClient.connect() 导出

[英]Export from MongoClient.connect() is not being read in other module

我正在尝试在另一个模块中重用我的 MongoClient 连接,并且在导入时导出为空。

索引.js

import app from './server.js'
import pkg from 'mongodb'
const { MongoClient } = pkg

let db = null

async function listDatabases(client) {
  try {
    const dbList = await client.db().admin().listDatabases()
    console.log('Databases:')
    dbList.databases.forEach((db) => {
    console.log(` - ${db.name}`) // I see the databases here
 })
} catch (error) {
   console.error(error)
 }
}

MongoClient.connect(uri, {
  useNewUrlParser: true,
  poolSize: 50,
  useUnifiedTopology: true,
})
 .then(async (client) => {
   listDatabases(client) // I see the databases here
   db = client
   app.listen(port, () => {
    console.log(`listening on port ${port}`)
  })
 })
.catch((err) => {
  console.error(err.stack)
  process.exit(1)
})

export default db

然后在 OrdersDAO.js 中,我导入 db 以便能够访问 db 和集合。 我提到了这个StackOverflow

import db from '../index.js'

static async getOrders() {
   try {
   // db is null here
   console.log('OrdersDAO.getOrders ~~~ made it to the OrdersDAO step 2', db)

  } catch (e) {
    console.error(`OrdersDAO ~~~ Unable to get orders: ${e}`)
    return { e }
  }
}

我究竟做错了什么?

下面是我原来的异步函数和随后的函数调用:index.js

const client = new MongoClient(uri, {
  useNewUrlParser: true,
  poolSize: 50,
  useUnifiedTopology: true,
})

async function connectToMongoDB() {
  try {
    await listDatabases(client)
    app.listen(port, () => {
    console.log(`listening on port ${port}`)
   })
 } catch (e) {
    console.error(`Index.js ~~~ Unable to get database.collection: ${e}`)
 } finally {
    console.log('Mongo Connection is closing ~~~~')
    await client.close()
  }
}

connectToMongoDB().catch(console.error)

连接到数据库是一个异步操作,因此,它返回一个Promise 在该函数内分配的任何内容只有在该承诺解决后才可用。 但是,您在承诺之外返回db对象,因此 js 引擎不会等待,而是返回初始值,即 null。
这是我在最近的一个项目中实现的一个整洁干净的解决方案,它也考虑了连接超时:

数据库.js

const {MongoClient}  = require("mongodb");
const {DATABASE_URL} = require("./config");

async function connect() {
  const client = await MongoClient.connect(DATABASE_URL, {
    useNewUrlParser: true
  });
   const db =  client.db();
   return { client, db };
 };

module.exports = { connect, dbHelper: connect()}

crud.js

const { dbHelper, connect } = require("./db");

async function reconnect() {
    return connect();
};

async function getConnectionOrReconnect() {
    let mongo = await Promise.resolve(dbHelper);
    if (!mongo.client.isConnected()) mongo = await reconnect();
    return mongo;
}

//other api functions here

在这里,我将同时导出连接函数本身和连接结果(作为承诺)。 与另一个文件相比,我正在解析导入的连接,如果它超时,我将再次重新连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM