GraphQL 拼接 - 为什么子模式中的字段会返回 null?

问题描述

我正在尝试将两种 GraphQL 模式拼接在一起,一种来自 contentful,一种来自 neo4j。

在跨组合模式的查询期间似乎会询问每个子模式,但“外部”字段总是返回为空。

我就是想不通这个。

示例查询

query {
  //Request data exclusively from the neo4j schema
  Product(id:"475e006f-b9cf-4f40-8712-271ceb46d14b"){
    id,name,weight
  },//This is a contentful schema query which should return weight from neo4j
  product(id:"[contentful-native-id]"){
      id,weight,}
}

结果:

  "data": {
    "Product": [
      {
        "id": "475e006f-b9cf-4f40-8712-271ceb46d14b","name": "Test product name","weight": 14.9
      }
    ],"product": {
      "id": "475e006f-b9cf-4f40-8712-271ceb46d14b","weight": null //This shouldn't be null! :(
    }
  }

日志记录:

//First query being executed against neo4j database
neo4j-graphql-js MATCH (`product`:`Product` {id:$id}) RETURN `product` { .id,.name,.weight } AS `product`
neo4j-graphql-js {
   "offset": 0,"first": -1,"id": "475e006f-b9cf-4f40-8712-271ceb46d14b"
 }

//Triggered by the second query correctly trying to resolve weight from neo4j
neo4j-graphql-js MATCH (`product`:`Product` {id:$id}) RETURN `product` { .weight,.id } AS `product`
neo4j-graphql-js {
   "offset": 0,"id": "475e006f-b9cf-4f40-8712-271ceb46d14b"
}

这似乎表明某些东西正在起作用,但权重的结果从未进入最终输出。 ApolloServer 不会通过 didEncounterErrors() 报告任何错误

拼接:

const gatewaySchema = stitchSchemas({
    subschemas: [{
            schema: neoSchema,merge: {
                Product: {
                    selectionSet: '{id}',fieldName: 'Product',args: ({
                        id
                    }) => ({
                        id
                    }),}
            }
        },{
            schema: contentfulSchema,merge: {

            }
        }
    ],})

架构:

const executor = async ({
    document,variables,context
}) => {
    const query = print(document);
    //console.log(query);
    const fetchResult = await fetch('https://graphql.contentful.com/content/v1/spaces/[SPACE]',{
        method: 'POST',headers: {
            'Content-Type': 'application/json','Authorization': `Bearer [AUTHTOKEN]`,},body: JSON.stringify({
            query,variables
        })
    });
    return fetchResult.json();
};

const contentfulSchema = wrapSchema({
    schema: await introspectSchema(executor),executor: executor
});

const driver = neo4j.driver(
    process.env.NEO4J_URI || 'bolt://localhost:7687',neo4j.auth.basic(
        process.env.NEO4J_USER,process.env.NEO4J_PASS
    ),{
        encrypted: process.env.NEO4J_ENCRYPTED ? 'ENCRYPTION_ON' : 'ENCRYPTION_OFF',}
)

const neoSchema = makeAugmentedSchema({
    typeDefs: typeDefs,});

服务器:

 const server = new ApolloServer({
      schema: gatewaySchema,context: ({ req }) => {
        return {
          driver,req
        };
      },plugins:[
        myPlugin
      ]
    });

非常感谢任何见解或想法!

解决方法

这似乎是因为 ApolloServer 不支持stitchSchemas...

Does Apollo Server work with GraphQL Tools stitchSchemas?