首页 > 解决方案 > 拦截 knex.js 查询预执行

问题描述

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

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

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

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

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

标签: node.jspostgresqlexpressknex.js

解决方案


我注意到这个建议附在Knex GitHub 问题上(感谢 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()

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


推荐阅读