创建数据库对象后使用
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 中删除并将其作为管理器放在这里。
我正在尝试构建一个快速服务器。
在 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
.
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 中删除并将其作为管理器放在这里。