【发布时间】:2019-06-11 01:39:12
【问题描述】:
我构建了一个 TS,MongoDB 客户端包装器。由于某种原因,当我调用获取连接的函数时,它的回调被调用了两次。
共有 2 次调用 get() 函数,1 次在导出之前,如您所见,另一个来自 mocha 测试。
总的来说,我对 TS 和 JS 很陌生,但这似乎有点不对劲。
import {Db, MongoClient} from "mongodb"; import {MongoConfig} from '../config/config' class DbClient { private cachedDb : Db = null; private async connectToDatabase() { console.log('=> connect to database'); let connectionString : string = "mongodb://" + MongoConfig.host + ":" + MongoConfig.port; return MongoClient.connect(connectionString) .then(db => { console.log('=> connected to database'); this.cachedDb = db.db(MongoConfig.database); return this.cachedDb; }); } public async get() { if (this.cachedDb) { console.log('=> using cached database instance'); return Promise.resolve(this.cachedDb); }else{ return this.connectToDatabase(); } } } let client = new DbClient(); client.get(); export = client;
控制台输出在哪里:
=> connect to database => connected to database => connected to database
这是行为不端的任何特定原因?
【问题讨论】:
-
旁注:在设置
this.cachedDb之前,可能会多次调用get,这会导致创建Db的多个连接/实例。这可以通过将connectToDatabase的承诺分配给私有属性然后在get中返回该承诺来避免(尽管它可能应该以某种方式处理失败)。 -
你的 Promise 逻辑有缺陷。除了 David 所建议的之外,
get()方法返回一个包装在一个承诺中的 Promise 或一个已解决的承诺 (this.cachedDb) 包装在一个承诺中。但也不要使用。你从MongoClient.connect()的承诺返回,但从不使用它(除了从get返回)。最后,你在 promise 上使用 then 并返回一个永远不会被使用的值。或许您应该回顾一下Mongo Guides 中非常简单的设计 -
@RandyCasburn 在该代码中我没有看到任何包含在承诺中的承诺(返回承诺的承诺)。也许我错过了什么?
-
@David -
connectToDatabase()是异步的并返回一个 Promise 对象,该 Promise 对象由get()直接返回,也是一个异步函数,它返回一个包装在 Promise 中的 Promise。 -
@Gleeb - 看看这个gist 这是你的课程以更简洁的方式编写。
标签: javascript typescript mocha.js