graphql 在sub query 子查询中获取header中的token

以下内容基于graphql-yoga,它是基于apollo graphql server,并整合了

  • graphql-subscriptions/subscriptions-transport-ws: GraphQL subscriptions server
  • graphql.js/graphql-tools: GraphQL engine & schema helpers
  • graphql-playground: Interactive GraphQL IDE

graphql client端将token添加到header中发送到server端,然鹅在graphql server端的子查询中,无法从context中获取任何信息。因为client端发送请求,只有父查询中有context。

以 database与datatable的关系为例:

type Query {
database(id: Int!):Database
datatables:[DataTable!]!
}
type Database{
id: Int
name: String
datatable_list:[DataTable]
}
type DataTable{
id: Int
name: String
}

父查询获取token的方法是:

const datatable=(root, { id },context)=>{
    token=context.request.get('token')
    return fetch(`${baseURL}/datatable/${id}`,{headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'wx-token':token,
    }}).then(res => res.json())}

其子查询获取token的方法是:

Database:{
    async datatable_list({ id },context){
        return await fetch(`${baseURL}/database/${id}/datatables`,{headers: {
            'Content-Type': 'application/json',
            'Accept': 'application/json',
            'wx-token':context.request.get('token'),
        }}).then(res => res.json())}
},

通过异步调用,可以共享父查询的context。

 

你可能感兴趣的:(前端)