gpt4 book ai didi

javascript - 使用异步队列控制数据库连接请求

转载 作者:行者123 更新时间:2023-11-30 17:15:02 25 4
gpt4 key购买 nike

我正在使用 Node 和 Mongodb Native 构建一个应用程序。我正在开发一个 db 模块,我可以在其他模块中调用它,这样我最终只使用一个连接。模块 db.js 以这段代码开始:

var _db = null;
var getDb = module.exports.getDb = function(callback) {
if (_db) {
console.log('_db returned');
return callback(null, _db);
}
MongoClient.connect('mongodb://localhost:' + config.db.port + '/' + config.db.name, {native_parser: true}, function (err, db) {
if (err) return callback(err);
console.log('_db created');

_db = db;
callback(err, _db);
});
};

在我需要数据库连接的其他模块中,我这样做

db.getDb(function (err, connection) {
// Do something with connection
});

它工作正常。但一个令人不快的问题是,如果我的代码在很短的时间内多次调用 getDb,我最终会得到一个连接的多个副本。就像我在所有需要数据库连接的模块的开头执行我的 db.js 要求和 getDb 调用一样

我现在正在考虑通过排队来控制对 getDb 的调用,这样只有绝对的第一个调用才会创建连接并将其保存在 _db 中。所有后续调用都将获得创建的连接 _db 作为返回。我相信Async queue会帮助我...

问题是我不明白我是如何用异步队列写这个的。文档有点含糊,我在网上找不到更好的例子。也许你可以给我一些提示。这是我到目前为止得到的...

var dbCalls = async.queue(function (task, callback) {
if (_db) {
console.log('_db returned');
return callback(null, _db);
}
MongoClient.connect('mongodb://localhost:' + config.db.port + '/' + config.db.name, {native_parser: true}, function (err, db) {
if (err) return callback(err);
console.log('Connected to mongodb://localhost:' + config.db.port + '/' + config.db.name);

_db = db;
callback(null, _db);
});
}, 1);

// I guess this .push() must be the exposed (exported) API for other modules to get a connection, but how do I return it to them,
dbCalls.push(null, function (err) {
console.log('finished processing foo');
});

dbCalls.push(null, function (err) {
console.log('finished processing bar');
});

我不明白作为第一个参数传递给 .push() 的对象如果用于什么我应该使用什么?现在它是 null 我如何将连接和可能的错误一直传递到发出调用的模块?

最佳答案

没有 async.queue 的快速而肮脏的解决方案:

var _db      = null;
var _err = null;
var _queue = [];
var _pending = false;

var getDb = module.exports.getDb = function(callback) {
if (_err || _db) {
console.log('_db returned');
return callback(_err, _db);
} else if (_pending) { // already a connect() request pending
_queue.push(callback);
} else {
_pending = true;
_queue.push(callback);
MongoClient.connect(..., function (err, db) {
_err = err;
_db = db;
_queue.forEach(function(queuedCallback) {
queuedCallback(err, db);
});
});
};

关于javascript - 使用异步队列控制数据库连接请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26275375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com