【问题标题】:Intercepting knex.js queries pre-execution拦截 knex.js 查询预执行
【发布时间】:2020-02-10 22:00:27
【问题描述】:

我正在为一个使用 knex.js 处理所有 sql 相关内容的应用程序制定缓存策略。 有没有办法拦截查询以检查是否可以从缓存中获取而不是查询数据库?

简要查看了 knex.js 事件,其中有一个查询事件。 文件: 查询事件在查询发生之前触发,提供有关查询的数据,包括连接的 __knexUid / __knexTxId 属性和有关查询的任何其他信息,如 toSQL 中所述。用于记录整个应用程序中的所有查询。

这意味着可以做类似的事情(也来自文档)

  .from('users')
  .on('query', function(data) {
    app.log(data);
  })
  .then(function() {
    // ...
  });

但是是否可以在实际执行对数据库的查询之前使 on query 方法拦截并执行一些逻辑?

【问题讨论】:

    标签: node.js postgresql express knex.js


    【解决方案1】:

    我注意到这个建议附在Knex GitHub issue(感谢 Arian Santrach)上,看起来很相关:

    knex.QueryBuilder.extend('cache', async function () {
        try {
            const cacheKey = this.toString()
            if(cache[cacheKey]) { 
                return cache[cacheKey]
            }
            const data = await this
            cache[cacheKey] = data
            return data
        } catch (e) {
            throw new Error(e)
        }
    });
    

    这将允许:

      knex('tablename').where(criteria).cache()
    

    检查同一查询的缓存数据。我认为无论您的缓存解决方案是什么,都可以使用类似的结构,使用查询的字符串表示作为键。

    【讨论】:

    • knex.QueryBuilder.extend 代码块放在哪里?
    • 无论您在何处实例化/初始化您的数据库对象。 IOW,您在第一次查询之前执行需求/配置...。
    • 非常好的解决方案!谢谢。
    • 不错的解决方案!对我来说,它不起作用,因为函数不能是异步的。所以,我把缓存保存在 then() return this.then((data) => { _cache[cacheKey] = data; return data; });
    猜你喜欢
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2016-05-19
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    相关资源
    最近更新 更多