Почему мой запрос findOne зависает на неопределенное время? - PullRequest
0 голосов
/ 17 марта 2020

Я только что создал новый проект [GitHub] с yarn create strapi-app для тестирования методов жизненного цикла модели. Я делаю поле для чтения и записи один раз под названием number_of_onsite_lessons. Я хочу иметь поле, в котором пользователь может указать, сколько Onsine Lessons должно быть сгенерировано при создании Onsite Course, а затем отключить это поле - или, по крайней мере, выдать ошибку, когда они пытаются изменить его значение.

To С этой целью я написал метод жизненного цикла OnsiteCourse:

  // Before updating a value.
  // Fired before an `update` query.
  beforeUpdate: async (model, attrs, options) => {
    const prev = await strapi.query("onsite-course").findOne({_id: model.id});
    console.log(prev,model);

    if (prev.number_of_onsite_lessons != model.number_of_onsite_lessons) {
      throw new Error("Can't change number of lessons - delete or create onsite lessons instead.")
    }
    if (prev.number_of_onsite_projects != model.number_of_onsite_projects) {
      throw new Error("Can't change number of projects - delete or create onsite projects instead.")
    }
  },

Когда я обновляю сущность OnsiteCourse, код запускается, но останавливается на await strapi.query("onsite-course").findOne({...}) и затем зависает на неопределенный срок. Я не получаю ошибку, и при этом я не получаю тот console.log на следующей строке.

Через некоторое время эта ошибка появляется в консоли:

[2020-03-17T07:42:30.558Z] error TimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
    at Bluebird.try.then.catch (/home/teri/projects/strapi/new/node_modules/knex/lib/client.js:318:17)
    at tryCatcher (/home/teri/projects/strapi/new/node_modules/bluebird/js/release/util.js:16:23)
    at /home/teri/projects/strapi/new/node_modules/bluebird/js/release/catch_filter.js:17:41
    at tryCatcher (/home/teri/projects/strapi/new/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/home/teri/projects/strapi/new/node_modules/bluebird/js/release/promise.js:547:31)
    at Promise._settlePromise (/home/teri/projects/strapi/new/node_modules/bluebird/js/release/promise.js:604:18)
    at Promise._settlePromise0 (/home/teri/projects/strapi/new/node_modules/bluebird/js/release/promise.js:649:10)
    at Promise._settlePromises (/home/teri/projects/strapi/new/node_modules/bluebird/js/release/promise.js:725:18)
    at _drainQueueStep (/home/teri/projects/strapi/new/node_modules/bluebird/js/release/async.js:93:12)
    at _drainQueue (/home/teri/projects/strapi/new/node_modules/bluebird/js/release/async.js:86:9)
    at Async._drainQueues (/home/teri/projects/strapi/new/node_modules/bluebird/js/release/async.js:102:5)
    at Immediate.Async.drainQueues [as _onImmediate] (/home/teri/projects/strapi/new/node_modules/bluebird/js/release/async.js:15:14)
    at processImmediate (internal/timers.js:443:21)

1 Ответ

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

У меня возникли те же проблемы с использованием разъема sqlite3.0.0-beta.20)

// tryed on beforeCreate, beforeUpdate and beforeSave
await strapi.query("product").findOne({ id: 1 })
await strapi.api.product.services.product.findOne({ id: 1 })
await strapi.api.product.controllers.product.findOne({ params: { id: 1 } })
await strapi.services.product.findOne({ id: 1 })

, решенного с помощью mongodb (mysql и другие тоже должны работать!)

...