我正在使用node-mongodb驱动程序编写一些node.js代码。当我像这样获取它们时,我决定缓存集合对象:
var db = connectionObject;
function getCollection(collectionName) {
return function(callback) {
var cache;
if (cache) return callback(null, cache);
db.collection(collectionName, function(err, collection) {
return err ? callback(err) : callback(null, cache = collection);
});
}
}
var usersCollection = getCollection('users');
usersCollection(function(err, collection) {
collection.find({}); // Rest of code here ...
});
对usersCollection函数的重复调用应使用缓存的集合对象,但它不会 - 缓存变量始终未定义。将代码更改为此可以解决问题:
return function(callback) {
var cache = arguments.callee;
if (cache.cached) return callback(null, cache.cached);
db.collection(collectionName, function(err, collection) {
return err ? callback(err) : callback(null, cache.cached = collection);
});
}
我仍然对'cache'变量超出范围的原因感到困惑。我做错了什么?
答案 0 :(得分:5)
我想你想要这个:
function getCollection(collectionName) {
var cache;
return function(callback) {
而不是你现在所拥有的:
function getCollection(collectionName) {
return function(callback) {
var cache;
答案 1 :(得分:1)
从cache
(getCollection
)返回的函数执行后,usersCollection
没有关闭。没有从该范围返回的函数。
cache
需要在usersCollection
函数之外定义,以便对其进行任何引用。