代码之家  ›  专栏  ›  技术社区  ›  Alwaysblue

使用Mongoose设置Redis时了解JS代码

  •  0
  • Alwaysblue  · 技术社区  · 6 年前

    我试图理解使用redis在nodejs中进行缓存。

    在讲座中,讲师告诉我们,设置缓存的最佳位置将在Mongoose的exec函数之前。

    所以为了做到这一点,他做到了

    const mongoose = require('mongoose')
    
    const exec = mongoose.Query.prototype.exec;
    //Redis logic
    mongoose.Query.prototype.exec = function () {
     console.log("i am here") 
     return exec.apply(this, argument);
    }
    

    第一: 什么会分类 mongoose.Query.prototype.exec; AS?值类型还是引用类型?因为如果它是引用类型,那么当我们更改 mongoose.Query.prototype.exec = function 那么它的价值也不应该改变吗?

    第二 我不能理解这句话 return exec.apply(this, argument); 有人能详细解释这一点吗,即在“应用点到哪里”中?他正在通过辩论 (this, argument); 这个论点是从哪里来的?

    有人能帮我回答以上两个问题吗?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Vasan    6 年前

    Mongoose.query.prototype.exec;的分类是什么?值类型或 参考类型?因为如果它是引用类型,那么当我们更改 mongoose.query.prototype.exec=函数

    exec 属于引用类型,但它被分配给另一个引用变量的值 mongoose.Query.prototype.exec . 你可以这样想: mongoose.query.prototype.exec 它本身指向内存中的一个对象(函数对象),现在在赋值之后, 执行程序 也指向同一对象-换句话说,对象的内存地址(按值)是从 mongoose.query.prototype.exec 执行程序 在分配期间。所以变量的值 mongoose.query.prototype.exec 本身,即存储在其中的内存地址,可以在不影响其他变量的情况下进行更改。 执行 . 它们都将指向两个不同的对象。

    有人能详细解释这一点吗,即在“应用点到哪里”中?

    在这种情况下,它将是调用此函数的对象,即 Query 实例。

    他正在通过论点(这就是论点);那个论点是从哪里来的?

    除非您在问题中遗漏了一些代码来复制粘贴, argument 似乎是个打字错误。他可能指的是内置物体 arguments 它可以在每个函数内部访问,并由传递给函数的参数组成。这里是一个 reference .

    在较高的层次上,讲师要做的是覆盖函数的内置行为。 Query.exec() 添加一些他自己的自定义处理。他首先创建原始函数的“备份”,然后将query.exec指向他的自定义函数,该函数添加自定义处理(日志语句),然后将控制权移交给备份,即继续执行内置行为。在这一点之后对查询实例调用exec()的任何人都将看到被重写的功能——首先是一条日志语句,然后是的内置行为 exec()