0

我正在尝试将两个 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,
   "first": -1,
   "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
      ]
    });

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

4

1 回答 1

0

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

Apollo Server 是否可以与 GraphQL 工具stitchSchemas 一起使用?

于 2021-01-04T16:02:26.347 回答