[英]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.