很难理解上下文配置(在数据源中)

Having a hard time understanding the context configuration (within DataSources)

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

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

然而,当涉及到 DataSources 的 class 扩展与 Apollo 的 GitHub 回购中看到的 context.As 之间的关系时,我无法清楚地定义一个心智模型,如何通过解构 dataSource 访问自定义数据源的方法,如下所示:

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

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

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

但如果是这样的话,{dataSources}解构在解析器中就没有意义了,那么dataSources和context到底是什么关系呢?谢谢!

Apollo 服务器将 initialize dataSources within processGraphQLRequest function, it will call dataSources.initialize() 方法与 GraphQL 请求上下文。这就是为什么您可以在自定义数据源 .initialize() 方法中获取 context 对象。并将 dataSources 赋值给 context 的 dataSources 属性,这就是为什么你可以在 GrapQL 解析器中通过解构得到 dataSources

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

executeOperation method of ApolloServerBase.

内部调用的processGraphQLRequest函数