mongoose中传递给exec函数的参数“arguments”是什么?

rekjcdws  于 2022-12-13  发布在  Go
关注(0)|答案(1)|浏览(125)

我一直试图在我的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()是什么?如果有人能解释我这个逻辑,我将不胜感激,因为我没有在文档或互联网博客和文章中找到任何帮助

ckocjqey

ckocjqey1#

arguments对象是一个局部变量,可在JavaScript中的每个函数内使用,它包含传递给函数的参数值。
this.getOptions()是将选项返回给查询的本地方法。

// A key example for mongoose Redis integration
const key = JSON.stringify({
    collectionName: this.mongooseCollection.name,
    op: this.op,
    options: this.getOptions(),
    filter: this.getFilter(),
    projection: this.projection(),
    populatedPaths: this.getPopulatedPaths(),
  });

NPM上有很多类似的包,但我强烈推荐标准的mongooseredis包来启动和运行。我假设您的初始化点与this post类似。This也可以是相关的源代码。

相关问题