Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用knex的异步子查询_Javascript_Asynchronous_Async Await_Knex.js - Fatal编程技术网

Javascript 使用knex的异步子查询

Javascript 使用knex的异步子查询,javascript,asynchronous,async-await,knex.js,Javascript,Asynchronous,Async Await,Knex.js,这里的问题不在于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 k

这里的问题不在于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();
});
我不知道如何将子查询传递给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)
我以为我在所有合适的地方等待。显然我没有。我错过了什么


注意:我特别感兴趣的是在这里使用async/Wait,而不是Promissions。

如果需要从异步函数返回查询生成器而不触发查询,则需要将生成器包装到对象中

以下是一些与knex问题相关讨论的链接

大概是这样的:

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

您是否在没有使用catchAsync的情况下尝试了它?我不应该影响任何事情,因为它是一个简单的try/catch助手。不管是哪种方式,我刚才尝试过,但它仍然返回一个空数组。是的,但是在找到罪魁祸首之前,在尝试调试问题时应该使用普通调用。您应该创建一个简单的查询,并确保连接对象实际连接到数据库。请参阅调试输出,没有任何关于不访问数据库(即sqlite)的内容,连接到文件没有任何问题。此外,第二个块中的id来自数据库,并且与查询匹配-连接良好,响应返回。事实上,现在您提到了调试日志,我看到第二个查询上的绑定从2开始,所以我假设子查询返回id>1。这是正确的吗?你们桌上有4张记录吗?先生,你们是一位学者和一位绅士!这就解决了这个问题,尽管它在我可怜的头脑中制造了更多的困惑。wait subquery是如何工作的?子查询不是函数,不是吗?。我还有很多东西要学!另一方面,我遇到了这里描述的async/await的另一个问题:我试图应用您的答案中的方法,但这并没有让我得到任何结果。如果你有空闲时间可以看一看,我会永远感激你。我也回答了reddit,可能听起来很粗鲁,但实际上没有冒犯,只是匆匆写下:没有冒犯:-