Перехват knex.js запросов перед выполнением - PullRequest
1 голос
/ 14 октября 2019

Я работаю над стратегиями кеширования для приложения, которое использует knex.js для всего, что связано с SQL. Есть ли способ перехватить запрос, чтобы проверить, можно ли его получить из кэша вместо запроса к базе данных?

Кратко рассмотрим события knex.js, в которых есть событие запроса. Doc: событие запроса вызывается непосредственно перед выполнением запроса, предоставляя данные о запросе, включая свойства __knexUid / __knexTxId соединения и любую другую информацию о запросе, как описано в toSQL. Полезно для регистрации всех запросов в вашем приложении.

Это означает, что можно сделать что-то вроде (также из документов)

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

Но возможно ли перехватить метод on query исделать некоторую логику, прежде чем на самом деле выполнить запрос к базе данных?

1 Ответ

0 голосов
/ 15 октября 2019

Хочу отметить, что это предложение прилагается к проблеме Knex GitHub (благодарность Ариану Сантраху), которая представляется актуальной:

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()

для проверки кэшированных данных для того же запроса. Я бы подумал, что подобную структуру можно использовать для любого решения для кэширования, используя строковое представление запроса в качестве ключа.

...