标签: apollo-server

Apollo GraphQL:查询返回不同类型对象的架构?

我有三个不同的 PostGres 表,每个表包含不同类型的同事。每种类型的数据库字段都不同——这就是它们位于三个单独的表中的原因。

我有一个组件可以访问任何类型的同事。现在从我迄今为止遇到的示例来看,一个组件通常与一个 GraphQL 查询相关联,例如:

const withData = graphql(GETONEASSOCIATE_QUERY, {
    options({ navID }) {
        return {
            variables: { _id: navID}
        };
    }
    ,
    props({ data: { loading, getOneAssociate } }) {
        return { loading, getOneAssociate };
    },


});

export default compose(
    withData,
    withApollo
)(AssociatesList);
Run Code Online (Sandbox Code Playgroud)

似乎给定的 GraphQL 查询只能返回单一类型的记录,例如在模式中:

getOneAssociate(associateType: String): [associateAccountingType]
Run Code Online (Sandbox Code Playgroud)

问题:是否可以设计一个 GraphQL 模式,使得单个查询可以返回不同类型的对象?解析器可以接收一个 AssociateType 参数,该参数告诉它要引用哪个 postGres 表。但是架构会是什么样子,以便它可以根据需要返回 AssociateAccountingType、associateArtDirectorType、associateAccountExecType 等类型的对象?

预先感谢所有人提供的任何信息。

apollo-server apollostack

1
推荐指数
1
解决办法
2303
查看次数

GraphQL 架构错误

所以当我启动我的服务器时,我得到了这个错误列表

/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:966 throw (0, _error.syntaxError)(lexer.source, token.start, 'Expected ' + kind + ', found ' + (0, _lexer.getTokenDesc)(token)); ^ GraphQLError at syntaxError (/Users/charlie/workspace/HackQLServer/node_modules/graphql/error/syntaxError.js:28:15) at expect (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:966:32) at parseName (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:88:15) at parseInputValueDef (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:743:14) at many (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:1015:16) at parseArgumentDefs (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:735:10) at parseFieldDefinition (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:714:14) at any (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:1002:16) at parseObjectTypeDefinition (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:683:16) at parseTypeSystemDefinition (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:607:16) at parseDefinition (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:148:16) at parseDocument (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:106:22) at Object.parse (/Users/charlie/workspace/HackQLServer/node_modules/graphql/language/parser.js:43:10) at buildSchemaFromTypeDefinitions (/Users/charlie/workspace/HackQLServer/node_modules/graphql-tools/src/schemaGenerator.ts:145:37) at _generateSchema (/Users/charlie/workspace/HackQLServer/node_modules/graphql-tools/src/schemaGenerator.ts:72:18) at makeExecutableSchema (/Users/charlie/workspace/HackQLServer/node_modules/graphql-tools/src/schemaGenerator.ts:97:20)

随着这一切的出现。我真的不明白我的错误在哪里。这是我的架构文件,我假设错误是

const typeDefinitions = `
    type Author {
      id: Int
      firstName: String
      lastName: …
Run Code Online (Sandbox Code Playgroud)

sequelize.js graphql apollo-server

1
推荐指数
1
解决办法
2850
查看次数

为接口编写 Apollo 解析器

假设我有以下 typedef:

interface Node {
  id: ID!
}

type Foo implements Node {
  id: ID!
  quantity: Int
}

type Bar implements Node {
  id: ID!
  name: String
}
Run Code Online (Sandbox Code Playgroud)

我发出的每一个ID,我都想以同样的方式处理。目前我需要一些解析器,如:

interface Node {
  id: ID!
}

type Foo implements Node {
  id: ID!
  quantity: Int
}

type Bar implements Node {
  id: ID!
  name: String
}
Run Code Online (Sandbox Code Playgroud)

使用许多类型实现Node,这会导致大量代码重复,开发人员很容易忘记编码 id 的正确方法,或者忘记将它们全部编码。

有没有办法做这样的事情?

{
  // ...
  Foo: {
    id: (root) => encodeId(root.id, root.type),
    // ...
  },
  Bar: {
    id: (root) => encodeId(root.id, …
Run Code Online (Sandbox Code Playgroud)

node.js graphql apollo-server apollostack

1
推荐指数
1
解决办法
1050
查看次数

如何在 jest / apollo 客户端中捕获被拒绝的 graphql 订阅?

使用 graphql-yoga 我试图编写笑话测试来覆盖订阅。

如果订阅有效(使用身份验证),我能够成功测试快乐路径。不幸的是,我无法测试订阅 websocket 连接被拒绝的情况。

在我的服务器设置中,我拒绝任何未通过我的身份验证标准的 websocket 连接:

const app = await server.start({
    cors,
    port: process.env.NODE_ENV === "test" ? 0 : 4000,
    subscriptions: {
      path: "/",
      onConnect: async (connectionParams: any) => {
        const token = connectionParams.token;
        if (!token) {
          throw new AssertionError({ message: "NO TOKEN PRESENT" });
        }
        const decoded = parseToken(token, process.env.JWT_SECRET as string);
        const user = await validateTokenVersion(decoded, redis);
        if (user === {}) {
          throw new AssertionError({ message: "NO VALID USER" });
        }
        return { user }; …
Run Code Online (Sandbox Code Playgroud)

typescript jestjs graphql apollo-server graphql-subscriptions

1
推荐指数
1
解决办法
1221
查看次数

Apollo 联合网关和另一个服务器实现

我正在阅读有关阿波罗联邦以及如何从模式拼接迁移的信息,当我阅读时出现了一个问题:

从拼接网关迁移到 Apollo Federation 的基本策略是首先使底层服务具有联邦能力

https://www.apollographql.com/docs/apollo-server/federation/migrating-from-stitching/#adding-federation-support-to-services

基本上联邦网关不能接受另一个不知道联邦的服务?所以没有办法将联合与另一个 graphql 服务器(例如https://github.com/nuwave/lighthouse)一起使用,还是我应该误解那条线?

apollo-server apollo-federation

1
推荐指数
1
解决办法
1878
查看次数

合并模式后“GraphQLError:在类型中找不到字段:'query_root'”

我使用 graphql-tools 缝合了两个 graphql 端点。使用一个端点架构它工作正常,但使用另一个架构它会抛出此错误“GraphQLError:在类型中找不到字段:'query_root'”。即使我可以在内省时看到所有模式。

    const createRemoteExecutableSchemas = async () => {
        let schemas = [];
        for (let api of graphqlApis) {
            const http =  http_link.HttpLink({
                uri: api.uri,
                fetch:fetch
            });
            const link1 = setContext.setContext((request, previousContext) => {
                return {
                    headers:{authorization: previousContext.graphqlContext.headers.authorization}
                }
            }).concat(http);

            const link2 = setContext.setContext((request, previousContext) => ({
                headers: {
                    'x-hasura-admin-secret': api.secret
                }
              })).concat(http);
            const remoteSchema = await gtool.introspectSchema(link2);
            const remoteExecutableSchema =  gtool.makeRemoteExecutableSchema({
                schema: remoteSchema,
                link:link1
            });
            schemas.push(remoteExecutableSchema);
        }
        return schemas;
    };

    const createNewSchema = async () => …
Run Code Online (Sandbox Code Playgroud)

schema nodes graphql apollo-server graphql-tools

1
推荐指数
1
解决办法
5562
查看次数

既不是突变也不是查询的 Apollo/GraphQL 操作

有时,您需要 API 来执行不涉及检索或操作数据的操作。例如,发送“忘记密码”电子邮件或与第三方 API 交互。

Apollo(或 GraphQL 本身)是否有推荐的方法来实现这一点?

如果没有,有什么解决方案可以在仍然利用 Apollo 的好处(例如模式/类型检查)的同时实现这一点?

apollo graphql apollo-server

1
推荐指数
1
解决办法
167
查看次数

在 GraphQL 服务器设置中何时使用 Redis 以及何时使用 DataLoader

我已经在 GraphQL 服务器上工作了一段时间,虽然我了解大部分方面,但我似乎无法掌握缓存。

谈到缓存,我看到提到了 DataLoader 和 Redis,但我不清楚什么时候应该使用什么以及如何使用它们。

我认为 DataLoader 在字段级别上更多地用于解决 n+1 问题?我猜 Redis 处于更高的水平呢?

如果有人能对此有所了解,我将不胜感激。

谢谢你。

caching redis apollo graphql apollo-server

1
推荐指数
1
解决办法
953
查看次数

禁用操场时,阿波罗服务器返回 GET 查询丢失

当我模拟production(aka, playground is disabled) 并转到我的根目录时,http://localhost:9000/我收到以下响应:

400 Bad Request

GET query missing
Run Code Online (Sandbox Code Playgroud)

有没有办法防止这种情况或解决方法来呈现其他页面?

我是阿波罗的新手。我只使用apollo-server(没有快递)。我将不胜感激任何帮助。

apollo graphql apollo-server

1
推荐指数
2
解决办法
4170
查看次数

在特定路径初始化 ApolloServer

我有这些代码行来初始化 ApolloServer,它工作正常

const server = new ApolloServer({schema, executor});
return server.listen(port).then(({url}) => {});
Run Code Online (Sandbox Code Playgroud)

我想更改 URL,这样做

return server.listen(port).then(({"dev.cold.net"}) => {});
Run Code Online (Sandbox Code Playgroud)

但我有一个编译错误:

TS2339: Property 'dev.cold.net' does not exist on type 'ServerInfo'
Run Code Online (Sandbox Code Playgroud)

node.js typescript apollo graphql apollo-server

1
推荐指数
1
解决办法
619
查看次数