【发布时间】:2017-08-24 01:47:18
【问题描述】:
我有一个执行多个 Mongo 操作的函数,最后一个操作是在所有其他操作完成后关闭数据库。我对自己对问题的处理相当有信心,但我有一些外部 cmets 提出了担忧,我想验证我的解决方案是否正确。
建议的解决方案:
function updateDatabase (name, token) {
return new Promise((resolve, reject) => {
MongoClient.connect(MONGODB_URL)
.then( (database) => {
return database.collection('testCollection').update({name}, {$pull: {tokens: {$in: [token]}}})
.then( () => {
database.collection('log').insert({
name,
token
});
return database;
})
})
.then( (db) => {
db.close(true);
resolve(`Invalid token: ${token} has been removed from: ${name}`);
})
.catch( (err) => {
reject(err);
})
});
}
我原来的解决方案:
function updateDatabase (name, token) {
return new Promise((resolve, reject) => {
MongoClient.connect(MONGODB_URL)
.then( (database) => {
return database;
})
.then( (db) => {
database.collection('testCollection').update({name}, {$pull: {tokens: {$in: [token]}}})
return database;
})
.then( () => {
database.collection('log').insert({
name,
token
});
return database;
})
.then( (db) => {
db.close(true);
resolve(`Invalid token: ${token} has been removed from: ${name}`);
})
.catch( (err) => {
reject(err);
})
});
}
我的原始解决方案是否偏离了标准,还是建议的解决方案是更好的方法?两者都在测试中工作,但针对生产级负载,我需要确保在其他操作完成之前数据库不会关闭,我相信我已经在我的原始解决方案中完成了这一点。
【问题讨论】:
-
您是在问两者之一是否会在完成操作之前关闭连接?如果是这样,如果你说他们都通过了你的测试,我认为他们不会,假设测试很好。还是您要进行风格比较?性能比较?
-
两种实现都缺乏:使用
new Promise包装基于promise 的代码是一种反模式,没有适当的错误检查(尽管建议的解决方案是bit 更好),并且数据库不会在catch处理程序中关闭。 -
@TW80000 我问的是两者之一是否会在完成操作之前关闭连接?我的测试不是负载测试或性能测试,只是检查更新是否发生以及数据库是否关闭。
-
@robertklep,这是一个很好的观点。也许我应该删除 return new Promise,只执行 MongoClient 操作,这将返回一个 promise 对象?
-
@jmcgui05 我不是专家,但如果连接在更新完成之前关闭,那么确保更新发生的测试将会失败,对吧?既然他们没有失败,你不能断定连接在操作后关闭,因此你的代码工作正常吗?它在我看来当然是正确的(除了 robertklep 提到的包装承诺)。
标签: node.js mongodb es6-promise