最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

截获knex.js的查询预执行

IT培训 admin 3浏览 0评论

截获knex.js的查询预执行

我正在为将knex.js用于所有与SQL相关的东西的应用程序制定缓存策略。有没有一种方法可以拦截查询,以检查是否可以从缓存中获取查询而不是查询数据库?

简要研究了具有查询事件的knex.js事件。文件:查询事件将在查询发生之前立即触发,提供有关查询的数据,包括连接的__knexUid / __knexTxId属性以及toSQL中描述的有关查询的任何其他信息。对于记录整个应用程序中的所有查询很有用。

这意味着可以执行类似的操作(同样来自文档)

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

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

回答如下:

[我注意到此建议附加在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.js的查询预执行

我正在为将knex.js用于所有与SQL相关的东西的应用程序制定缓存策略。有没有一种方法可以拦截查询,以检查是否可以从缓存中获取查询而不是查询数据库?

简要研究了具有查询事件的knex.js事件。文件:查询事件将在查询发生之前立即触发,提供有关查询的数据,包括连接的__knexUid / __knexTxId属性以及toSQL中描述的有关查询的任何其他信息。对于记录整个应用程序中的所有查询很有用。

这意味着可以执行类似的操作(同样来自文档)

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

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

回答如下:

[我注意到此建议附加在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()

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

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论