拦截 knex.js 查询预执行
Intercepting knex.js queries pre-execution
我正在为一个应用程序制定缓存策略,该应用程序对所有 sql 相关内容使用 knex.js。
有没有办法拦截查询以检查是否可以从缓存中获取它而不是查询数据库?
简要查看了 knex.js 个事件,其中有一个查询事件。
文档:
查询事件在查询发生之前触发,提供有关查询的数据,包括连接的 __knexUid / __knexTxId 属性和有关查询的任何其他信息,如 toSQL 中所述。用于记录整个应用程序中的所有查询。
这意味着可以做类似的事情(也来自文档)
.from('users')
.on('query', function(data) {
app.log(data);
})
.then(function() {
// ...
});
但是有没有可能让 on query 方法在实际执行对数据库的查询之前拦截并做一些逻辑?
我注意到此建议附在似乎相关的 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()
检查同一查询的缓存数据。我认为无论您的缓存解决方案是什么,都可以使用类似的结构,使用查询的字符串表示作为键。
我正在为一个应用程序制定缓存策略,该应用程序对所有 sql 相关内容使用 knex.js。 有没有办法拦截查询以检查是否可以从缓存中获取它而不是查询数据库?
简要查看了 knex.js 个事件,其中有一个查询事件。 文档: 查询事件在查询发生之前触发,提供有关查询的数据,包括连接的 __knexUid / __knexTxId 属性和有关查询的任何其他信息,如 toSQL 中所述。用于记录整个应用程序中的所有查询。
这意味着可以做类似的事情(也来自文档)
.from('users')
.on('query', function(data) {
app.log(data);
})
.then(function() {
// ...
});
但是有没有可能让 on query 方法在实际执行对数据库的查询之前拦截并做一些逻辑?
我注意到此建议附在似乎相关的 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()
检查同一查询的缓存数据。我认为无论您的缓存解决方案是什么,都可以使用类似的结构,使用查询的字符串表示作为键。