0

在扩展 Apollo Server 时,DataSources我们必须在类中创建一个初始化方法:

initialize(config){
  this.context=config.context
}

然而,当谈到 DataSources 的类扩展和上下文之间的关系时,我无法明确定义一个心智模型。正如 Apollo 的 GitHub 存储库中所见,访问自定义数据源方法的方法是通过解构 dataSource ,像这样:

getRandomData: (parent,args,{dataSource})=>{
  return dataSources.randomMethod()
}

然而,我们如何将上下文传递给 Apollo Server?我想是这样的:

const server= new ApolloServer({
   typeDefs,
   schema,
   context,
   dataSources:()=>({...})
}

但是如果是这样, {dataSources}解构在解析器中没有意义,那么数据源和上下文之间究竟是什么关系呢?谢谢 !

4

1 回答 1

0

Apollo 服务器将在processGraphQLRequest函数中进行初始化dataSources,它将使用 GraphQL 请求上下文调用dataSources.initialize()方法。这就是您可以在自定义数据源方法中获取对象的原因。并分配给上下文的属性,这就是您可以在 GrapQL 解析器中进行解构的原因。context.initialize()dataSourcesdataSourcesdataSources

  async function initializeDataSources() {
    if (config.dataSources) {
      const context = requestContext.context;

      const dataSources = config.dataSources();

      const initializers: any[] = [];
      for (const dataSource of Object.values(dataSources)) {
        if (dataSource.initialize) {
          initializers.push(
            dataSource.initialize({
              context,
              cache: requestContext.cache,
            }),
          );
        }
      }

      await Promise.all(initializers);

      if ('dataSources' in context) {
        throw new Error(
          'Please use the dataSources config option instead of putting dataSources on the context yourself.',
        );
      }

      (context as any).dataSources = dataSources;
    }
  }
}

在ApolloServerBase的executeOperation方法中processGraphQLRequest调用的函数。

于 2021-09-08T03:41:43.253 回答