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



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

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

然而,当涉及到datasource的类扩展和上下文之间的关系时,我不能清楚地定义一个心智模型。在阿波罗的GitHub仓库中可以看到,访问自定义数据源的方法是解构dataSource,如下所示:

getRandomData: (parent,args,{dataSource})=>{
return dataSources.randomMethod()
}
然而,我们如何将上下文传递给Apollo Server呢?我是这样想的:
const server= new ApolloServer({
typeDefs,
schema,
context,
dataSources:()=>({...})
}

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

Apollo服务器将在processGraphQLRequest函数中初始化dataSources,它将调用dataSources.initialize()方法与GraphQL请求上下文。这就是为什么可以在自定义数据源.initialize()方法中获得context对象的原因。并将dataSources分配给上下文的dataSources属性,这就是为什么您可以通过在graphql解析器中解构来获得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;
}
}
}

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

最新更新