首页 > 解决方案 > Strapi 嵌套,返回错误 Knex:获取连接超时。游泳池可能已经满了。你错过了一个 .transacting(trx) 电话

问题描述

我有这个查询:

 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
      }
    }
}

这是工作

似乎strapi无法过滤存在

标签: graphqlstrapi

解决方案


在第一个实例中,您将 argspresences作为员工的字段传递给,因此任何过滤都将在子解析器级别(而不是顶级查询)处理。您应该确认您正在适当地处理子解析器及​​其传递的参数。

相比之下,在第二个示例中,您正在作为顶级 Query 访问存在 - 换句话说,一个图形入口点,我预计您将在其中正确处理过滤条件。

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


推荐阅读