асинхронные подзапросы с knex - PullRequest
0 голосов
/ 18 апреля 2020

Проблема здесь не в knex, а в использовании его вместе с async / await. С этим из пути, вот простой пример:

const subquery = catchAsync(async () => {
  const res = await knex("author").select("id").where("id", ">", 1);

  return res;
});

const knexQuery = catchAsync(async () => {
  const res = await knex("author").where("id", "in", await subquery());

  return res;
});

const test = catchAsync(async (knexQuery) => {
  const res = await knexQuery();

  console.log(res)

  knex.destroy();
});

Я не могу понять, как передать subquery в knexQuery, поэтому он будет решен в нужный момент. В настоящее время он возвращает пустой массив, вот журнал отладки:

{
  method: 'select',
  options: {},
  timeout: false,
  cancelOnTimeout: false,
  bindings: [ 1 ],
  __knexQueryUid: '00baf1e0-81a5-11ea-9b17-3bbd9f85a577',
  sql: 'select `id` from `author` where `id` > ?'
}
{
  method: 'select',
  options: {},
  timeout: false,
  cancelOnTimeout: false,
  bindings: [ { id: 2 }, { id: 3 }, { id: 4 } ],
  __knexQueryUid: '00bc7880-81a5-11ea-9b17-3bbd9f85a577',
  sql: 'select * from `author` where `id` in (?, ?, ?)'
}
(empty array)

Я думал, что я await во всех нужных местах. Очевидно, что нет. Что я пропустил?

Примечание: я особенно заинтересован в использовании async / await здесь, а не в обещаниях.

1 Ответ

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

Если вам нужно вернуть построитель запросов из асинхронной функции c без запуска запроса, вам нужно заключить построитель в объект.

Вот некоторые ссылки на несколько связанные обсуждения в вопросах knex https://github.com/knex/knex/pull/2226#issuecomment -329589115

Примерно так:

const subquery = catchAsync(async () => {
  return {
    subQuery: knex("author").select("id").where("id", ">", 1)
  };
});

const knexQuery = catchAsync(async () => {
  const res = await knex("author").where("id", "in", (await subquery()).subQuery);

  return res;
});

const test = catchAsync(async (knexQuery) => {
  const res = await knexQuery();

  console.log(res)

  await knex.destroy();
});
...