创建数据库对象后使用

Use database object after it has been created

我正在尝试构建一个快速服务器。

app.js 文件中,我创建了服务器并尝试连接到我的 mongodb。

    import express from "express";
    import dbo from "./db/conn.js";
    
    const app = express();
    app.listen(PORT, async () => {
      await dbo.connectToDatabase();
      log.info(`Server is running on port: ${PORT}`);
    });

在文件中 conn.js


    const client = new MongoClient(uri);
    
    let db: Db;
    
    export async function connectToDatabase() {
      try {
        await client.connect();
    
        db = client.db(dbName);
    
        await db.command({ ping: 1 });
    
        log.info(`Successfully connected to database: ${db.databaseName}.`);
    
      } finally {
        await client.close();
      }
    }
    
    export async function getDb() {
      return db;
    }
    
    export default { connectToDatabase, getDb };

现在在一个单独的文件中,我想使用我在 app.js 文件中创建的数据库连接。

像这样:

const collection = getDb().collection(collectionName);

// insert documents in collection.

但是当我尝试 运行 应用时出现错误 TypeError: Cannot read properties of undefined

那么,有没有办法等到建立数据库连接?

您的代码存在一些问题。

首先,getDb函数returns承诺。所以你不能马上使用收集方法。删除 async 关键字,因为当前 getDb 函数不是异步函数。

export function getDb() {
  return db;
}

其次,在try&finally语句中,无论代码是否出现异常,finally块都无条件执行。因此,在connectToDatabase中显示连接成功日志后,连接立即关闭。为了插入数据,连接必须连接,所以请从connectToDatabase.

中删除finally块中的await client.close();代码

然后您可以毫无问题地将文档添加到集合中。

完成您想要做的事情的一种方法是将该连接传递给您在别处定义的 class 或函数。

假设这是您的集合代码(或者即使在集合之外需要原始数据库连接实例才能使用的任何东西):

class Collection {
  constructor(db) {
     this.db = db
     //do whatever else needs to be setup
  }
  use(name) {
     //or use it here
     this.db.use(name)
  }
}

export default Collection

然后在你的主文件中添加一些代码:

import Collection from './Collection.js'
const collection = new Collection(getDb)
collection.use('some arbitrary name')

这只是一种方法,但还有其他方法。此外,如果这是使用上面的 getDb() 方法的唯一方法,您可以将其从 main 中删除并将其作为管理器放在这里。