GraphQL-上下文是否传播到下游解析器?

GraphQL-上下文是否传播到下游解析器?,graphql,graphql-js,apollo-server,dataloader,Graphql,Graphql Js,Apollo Server,Dataloader,如果将修改后的上下文传递给GraphQL解析器,是否会传播到所有下游解析器?这是在GraphQL规范中指定的还是特定于实现的 用一个例子来说明,我有一个如下的问题 { companies { employees { positions { title } } } } 假设我从contextA开始进入companys查询,然后我有CompanyResolvers在那里我得到一个superSpecialContext并将其传递给员工数

如果将修改后的上下文传递给GraphQL解析器,是否会传播到所有下游解析器?这是在GraphQL规范中指定的还是特定于实现的

用一个例子来说明,我有一个如下的问题

{
  companies {
    employees {
      positions {
        title
      }
    }
  }
}
假设我从
contextA
开始进入
companys
查询,然后我有
CompanyResolvers
在那里我得到一个
superSpecialContext
并将其传递给
员工
数据加载器

export const CompanyResolvers = {
    employees: async ({ id }: CompanyDTO, args: object, contextA: Context) => {
      const superSpecialContext = await getSuperSpecialContext();
      return context.dataLoaders.employees.load({ id: company.id, context: superSpecialContext });
    }
};
当我到达
位置
解析器时,我现在是在使用
超特殊上下文
还是原始的
上下文
(我实际上更喜欢这种情况)

如果将修改后的上下文传递给GraphQL解析器,这是否会传播到所有下游解析器

是的,每个请求在请求期间都有自己的上下文对象。它是在GraphQL服务器上的上下文函数中创建的

从“apollo服务器”导入{apollo服务器,gql}
从'apollo server express/dist/ApolloServer'导入{ExpressContext};
常量typeDefs=gql`
打字簿{
标题:字符串
作者:String
}
类型查询{
书籍:[书籍]
}
`;
常数书=[
{
标题:《哈利波特与密室》,
作者:“J.K.罗琳”,
},
{
标题:《侏罗纪公园》,
作者:《迈克尔·克莱顿》,
},
];
常量解析程序={
查询:{
书籍:(obj:any,args:any,context:any)=>{
console.log(context.name);//Khalil Stemmler
context.name='Billy Bob Thorton'
还书;
},
},
书籍:{
标题:(obj:any,args:any,context:any)=>{
console.log(context.name);//比利·鲍勃·索顿。
//应该打印“比利·鲍勃·索顿两次”,每本书一次。
返回对象标题
},
}
};
const server=新服务器({
typeDefs,
解析器,
上下文:(expressContext:expressContext)=>{
//Apollo的上下文实现允许您钩住
//获取标题、令牌等访问权限的明确请求-按顺序
//获取经过身份验证的用户的会话数据并将其置于上下文中。
const{connection,res,req}=expressContext;
//为每个请求创建一个新的上下文对象
//应该返回一个对象。
返回{
姓名:“Khalil Stemmler”
}
}
});
//“listen”方法启动web服务器。
然后({url}:{url:string})=>{
console.log(`
如果将修改后的上下文传递给GraphQL解析器,这是否会传播到所有下游解析器

是的,每个请求在请求期间都会获得自己的上下文对象。它是在GraphQL服务器上的上下文函数中创建的

从“apollo服务器”导入{apollo服务器,gql}
从'apollo server express/dist/ApolloServer'导入{ExpressContext};
常量typeDefs=gql`
打字簿{
标题:字符串
作者:String
}
类型查询{
书籍:[书籍]
}
`;
常数书=[
{
标题:《哈利波特与密室》,
作者:“J.K.罗琳”,
},
{
标题:《侏罗纪公园》,
作者:《迈克尔·克莱顿》,
},
];
常量解析程序={
查询:{
书籍:(obj:any,args:any,context:any)=>{
console.log(context.name);//Khalil Stemmler
context.name='Billy Bob Thorton'
还书;
},
},
书籍:{
标题:(obj:any,args:any,context:any)=>{
console.log(context.name);//比利·鲍勃·索顿。
//应该打印“比利·鲍勃·索顿两次”,每本书一次。
返回对象标题
},
}
};
const server=新服务器({
typeDefs,
解析器,
上下文:(expressContext:expressContext)=>{
//Apollo的上下文实现允许您钩住
//获取标题、令牌等访问权限的明确请求-按顺序
//获取经过身份验证的用户的会话数据并将其置于上下文中。
const{connection,res,req}=expressContext;
//为每个请求创建一个新的上下文对象
//应该返回一个对象。
返回{
姓名:“Khalil Stemmler”
}
}
});
//“listen”方法启动web服务器。
然后({url}:{url:string})=>{

log(`实际上,在进一步考虑这一点之后,这应该是显而易见的,尽管我想再次检查DataLoader没有任何奇怪的魔力-对于基本解析程序,显然您不会获得下游解析程序的新上下文,因为这发生在graphql之外(在本例中,您并不是从
书籍
返回一个上下文,然后转到
标题
).但对你来说,如果你修改了上下文对象本身,那么它当然会在下游发生变化,因为它仍然是同一个对象。实际上,在进一步思考之后,它应该是显而易见的,尽管我想再次检查DataLoader没有做任何奇怪的魔术-对于基本解析程序,显然你不会得到新的下游解析程序的上下文,因为这发生在graphql之外(在本例中,这不像是从
书籍
返回上下文,然后再转到
标题
)。但是,对你来说,如果修改上下文对象本身,当然这将在下游更改,因为它仍然是同一个对象。
export const EmployeeResolvers = {
    positions: async ({ id }: EmployeeDTO, args: object, context: Context) => {
      // is my context here contextA or superSpecialContext?
    }
};