我想创建mongodb对象,该对象将具有连接连接后创建Collection的可选方法。
我有这样的东西(mongo.js):
import url from 'url';
import { MongoClient } from 'mongodb';
const getDbName = mongourl => {
const mongoPathName = url.parse(mongourl).pathname;
return mongoPathName.substring(mongoPathName.lastIndexOf('/') + 1);
}
export let db = null;
(async function() {
const dbURL = process.env.MONGO_URL;
const dbName = getDbName(dbURL);
const client = new MongoClient(dbURL, { useNewUrlParser: true });
try {
await client.connect();
db = client.db(dbName);
} catch (err) {
console.log(err);
}
})();
如果我想连接到数据库,我就是这样做:
import { db } from './libs/mongo';
但是我的问题是如何添加可选方法,以便在连接到数据库后可以在其中创建集合? 我想得到这样的东西:
import { db } from './libs/mongo';
db.then(() => { // if db is connected ->
//createCollection or something else
})
我想通过Promise做到这一点,但我不知道如何做。 我想至少在两个地方使用这个库。在第1步中,与基础连接,在第2个(独立)中连接并创建集合(设置)
答案 0 :(得分:0)
您的import
本身不应引起副作用。
在mongo.js
模块中,我建议导出一个包含async
方法的类或对象以返回数据库连接。
这是我在自己的一个项目中使用的方法,在该方法中,构造函数返回一个新对象,该对象最初仅具有connect
方法,该方法在被调用时将附加的与数据库相关的功能附加到该对象
class Database {
constructor(settings) {
this.connect = async () => {
let db = await MongoClient.connect(url, settings);
this.someDbMethod = () => {
return db.collection('foo').find(...);
}
return this;
}
}
}
用法:
let db = await new Database(url, settings).connect();
let rec = await db.someDbMethod();
构造函数不能异步,因此为什么我使用辅助函数执行实际连接。