Strapi вложенный, ошибка возврата Knex: Тайм-аут на установление соединения. Бассейн, вероятно, полон. Вам не хватает .transacting (trx) вызова - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть этот запрос:

 query{
    employees{
      fullname
      department
      position
      presences(where:{created_at_gt:"20200401"}){
        created_at
        Status
      }
    }
}

, возвращается ошибка:

errors": [
    {
      "message": "Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?",
...

, но когда я меняю запрос на:

 query{
        presences(where:{created_at_gt:"20200401"}){
      created_at
      Status
        employee{
        fullname
        department
        position
      }
    }
}

, это работает

похоже, страпи не могут фильтровать присутствие

1 Ответ

0 голосов
/ 25 апреля 2020

В первом случае вы передаете аргументы в presences в качестве поля сотрудника, и, таким образом, любая фильтрация будет обрабатываться на уровне промежуточного резольвера (а не на запросе верхнего уровня). Вы должны подтвердить, что правильно обрабатываете субрезольвер и его переданные аргументы.

В отличие от этого, во втором примере вы получаете доступ к присутствиям как к запросу верхнего уровня - другими словами, к точке входа в граф, где я ожидать, что вы правильно обрабатываете условия фильтрации.

И FWIW, с помощью knex, я успешно управлял соединениями, используя следующий шаблон, аналогичный тому, который описан где-то в документации:

const trxProvider = knex.transactionProvider();

firstTrx = await trxProvider(); 
   // Use firstTrx
   // **Some other logic***
secondTrx = await trxProvider();
   // Use secondTrx
   // **Some other logic***
thirdTrx = await trxProvider();
      // Use thirdTrx then commit
      thirdTrx.commit();

Вы можете удобно создавать эти ссылки на транзакции по желанию и все они будут ссылаться на один и тот же trx (даже если помечены разными именами). Это особенно полезно, если ваш trx передается обратному вызову (вызовам), но вы хотели бы, наконец, зафиксировать, например, из первоначально вызывающей функции. Следование этой схеме очень помогло с нашими проблемами с подключением.

Наконец, если ничего не работает, вы можете попытаться изменить конфигурацию вашего диспетчера подключений (см. Пул ниже):

 {
    client: 'pg',
    connection: {
      host: 
      port:
      user: 
      database: 
      password: 
    },
    pool: { min: 2, max: 20 },
    asyncStackTraces: true
  };
}

...