我一直试图在我的nodejs mongodb应用程序中使用带有redis的缓存,但是我没有找到任何关于如何做到这一点的教程,除了一些使用逻辑的教程,这些逻辑似乎没有在mongoose文档中解释
const exec = mongoose.Query.prototype.exec;
mongoose.Query.prototype.exec = async
function (){
// our caching logic
return await exec.apply(this, arguments);
}
参数从何而来?因为它似乎是未定义的,但却被使用
mongoose.Query.prototype.exec = async function(){
const collectionName = this.mongooseCollection.name;
if(this.cacheMe){
// You can't insert json straight to redis needs to be a string
const key = JSON.stringify({...this.getOptions(),
collectionName : collectionName, op : this.op});
const cachedResults = await redis.HGET(collectionName,key);
// this.op is the method which in our case is "find"
if (cachedResults){
// if you found cached results return it;
const result = JSON.parse(cachedResults);
return result;
}
//else
// get results from Database then cache it
const result = await exec.apply(this,arguments);
redis.HSET(collectionName, key, JSON.stringify(result) , "EX",this.cacheTime);
//Blogs - > {op: "find" , ... the original query} -> result we got from database
return result;
}
clearCachedData(collectionName, this.op);
return exec.apply(this,arguments);
}
getOptions()是什么?如果有人能解释我这个逻辑,我将不胜感激,因为我没有在文档或互联网博客和文章中找到任何帮助
1条答案
按热度按时间ckocjqey1#
arguments
对象是一个局部变量,可在JavaScript中的每个函数内使用,它包含传递给函数的参数值。this.getOptions()
是将选项返回给查询的本地方法。NPM上有很多类似的包,但我强烈推荐标准的
mongoose
和redis
包来启动和运行。我假设您的初始化点与this post类似。This也可以是相关的源代码。