使用联合模式创建 Apollo-Server

Posted

技术标签:

【中文标题】使用联合模式创建 Apollo-Server【英文标题】:Create Apollo-Server with Federated schema 【发布时间】:2021-11-09 11:22:54 【问题描述】:

我正在尝试使用从 GraphQL 文件加载的 TypeDefs 联合模式创建 Apollo-Server。但是,我收到此错误

Argument of type 'GraphQLSchema' is not assignable to parameter of type 'string | TemplateStringsArray'.

我相信我从文件中加载架构时使用了错误的函数loadSchema。 如何从文件中加载具有正确类型的架构以将其作为 TypeDef 提供给联合架构?

import  buildSubgraphSchema  from '@apollo/federation';
import  CodeFileLoader  from '@graphql-tools/code-file-loader';
import  loadSchema  from '@graphql-tools/load';
import  ApolloServer, gql  from 'apollo-server';
...

const typeDefs = await loadSchema(`$__dirname/auth.graphql`, 
  loaders: [new CodeFileLoader()],
);

const server = new ApolloServer(
 schema: buildSubgraphSchema([
     
        typeDefs: gql(typeDefs),    // Error here `typeDefs`
        resolvers,
     
  ]),
)

【问题讨论】:

【参考方案1】:

我也在从文件中加载子图架构,并这样做:

import  parse  from "graphql";
import  ApolloGateway  from "@apollo/gateway";
import * as fs from "fs";

const sdlStringFromFile = fs.readFileSync(
        `$__dirname/auth.graphql`
    );

new ApolloGateway(
  localServiceList: [
    name: "ServiceA",
    url: "https://servicea.com/graphql",
    typeDefs: parse(sdlStringFromFile)
  ]
)

【讨论】:

这种方式是上传子图的最佳做法吗? @Hazemalabiad 如果您要向 Apollo 询问最佳实践,我希望他们的回答是使用 Apollo Managed Federation 并让 Apollo 服务器在运行时从注册表加载架构。 如果我想将联合的单一、联合、组合的模式打印或输出到单个文件中呢?【参考方案2】:

您不需要使用gql 函数。架构已被解析。

import  buildSubgraphSchema  from '@apollo/federation';
import  CodeFileLoader  from '@graphql-tools/code-file-loader';
import  loadSchema  from '@graphql-tools/load';
import  ApolloServer  from 'apollo-server';
...

const typeDefs = await loadSchema(`$__dirname/auth.graphql`, 
  loaders: [new CodeFileLoader()],
);

const server = new ApolloServer(
 schema: buildSubgraphSchema([
     
        typeDefs: typeDefs,
        resolvers,
     
  ]),
)

【讨论】:

当我删除 gql 函数时,我得到另一个错误 Type 'GraphQLSchema' is missing the following properties from type 'DocumentNode': kind, definitionsts(2739) 我相信buildSubgraphSchema 期望typeDefsDocumentNode 类型。所以,我猜我们要么需要在加载时使用正确的函数,要么将graphqlschema转换为documentnode

以上是关于使用联合模式创建 Apollo-Server的主要内容,如果未能解决你的问题,请参考以下文章

自动创建一个视图,该视图将所有其他具有相同名称但不同前缀和不同模式的视图联合起来

混合模式联合身份验证和表单身份验证

Java开发基础不牢?mysql创建联合索引语句

设计模式总结

为 IIS 7 经典模式错误配置联合被动依赖方(无法执行 URL)

GraphQL,Apollo 服务器联合模式