Apollo Server中DataSources与context的配置及关联关系疑问
Apollo Server DataSources与context的关系说明
- 核心逻辑:DataSources是Apollo Server自动注入到context的内置属性,你手动配置的context内容和框架生成的dataSources会合并为最终的resolver上下文对象。
全流程运行逻辑
- 请求进入时,Apollo Server首先执行你配置的
context函数/对象,生成当前请求的自定义上下文(通常存储请求头、用户认证信息等) - 紧接着执行你配置的
dataSources工厂函数,生成所有自定义数据源的实例 - 框架自动调用每个数据源实例的
initialize方法,把包含自定义上下文的配置传入,你在方法内把this.context = config.context赋值后,就能在数据源的所有方法里访问当前请求的自定义上下文 - 所有初始化完成的数据源实例会被统一挂载到上下文的
dataSources字段上,最终resolver拿到的第三个参数就是合并了自定义内容和dataSources的完整上下文
配置写法的疑问解答
你给出的配置写法完全符合规范:
const server = new ApolloServer({ typeDefs, schema, context, dataSources: () => ({ /* 这里返回你的所有数据源实例 */ }) })
你不需要手动把dataSources写入context配置,框架会自动完成合并,所以resolver里直接解构{ dataSources }是完全合理的。
小提示:你给出的resolver示例存在笔误,正确写法需要注意复数形式,同时要对应你在
dataSources工厂函数里定义的数据源key:getRandomData: (parent, args, { dataSources }) => { // 假设你在dataSources工厂函数里返回的key为randomAPI return dataSources.randomAPI.randomMethod() }
内容的提问来源于stack exchange,提问作者Peter Malik
相关产品推荐
相关产品推荐

