在graphql和dataloader中使用pg-promise任务

问题描述

第一件事是说我已经看过这个问题Sharing a pg-promise task across parts of an http request并阅读了答案。我想增加一些复杂性来重温这个问题。

我正在apollo-server-express上的打字稿graphql服务器上工作,使用postgres数据库作为后端,使用pg-promise作为数据库接口库。我有使用数据加载器的查询解析器,其使用的模式如下:https://github.com/graphql/dataloader#creating-a-new-dataloader-per-request

根据建议,例如,通过pg-promise的单个实例进行所有数据库访问。 https://github.com/vitaly-t/pg-promise-demo/blob/master/TypeScript/db/index.ts

与原始问题一样,我试图找到一种创建Task的好方法,该Task可以并入数据加载器(或在调用数据加载器时作为参数传递),以便查询解析器在单个数据库连接中运行。我不知道将调用哪个解析器或将以什么顺序调用它们,所以我不能说某个解析器应该创建任务。

我一直在尝试找到一种方法来使用graphql Context来共享任务,因为我当前正在使用Context来共享数据加载器对象,但是如上所述,任务发生在回调函数中,因此无法通过Context共享任务。这是一个上下文设置示例:

/*
createLoaders() returns a new object of DataLoaders e.g.
{
  users: new DataLoader(ids => getUsers(ids)),tags: new DataLoader(ids => getTags(ids))
}
*/
import { createLoaders } from './dataloaders'

const server = new ApolloServer({
  schema,context: (): Promise<Context> => {
    // create a connection here to inject into createLoaders?
    const loaders = createLoaders()
    return { loaders }
  }
})

以及Apollo文档中在上下文中创建数据库连接的示例:https://www.apollographql.com/docs/apollo-server/data/resolvers/#the-context-argument(请注意,它们没有描述在任何地方关闭连接)。

context: async () => ({
  db: await client.connect(),})

// Resolver
(parent,args,context,info) => {
  return context.db.query('SELECT * FROM table_name');
}

在不使用connect方法的情况下可能无法实现,但是库的作者不建议将其用于这种类型的操作。并且出现了同样的问题,即在将结果发送回客户端之前最终解决了查询时,需要将连接返回到池中。

感谢您的帮助! (并感谢@ vitaly-t在pg-promise上所做的如此出色的工作)

编辑1 @ Daniel-Rearden您的建议,所要联系的要诀最终奏效。如果总是打开任务会引起问题,我可能会检查插件中的传入请求。将您的答案标记为正确!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)