GraphQL - 将 JSON 解析为 graphql 类型数组以支持批量查询 1:User.posts2:User.batchPostsJSON3:User.batchPosts

问题描述

我有一组 graphql 服务,这些服务使用 graphql-tools 模式拼接在网关中组合在一起。

以下是一些示例代码供参考:

async function makeGatewaySchema() {
  // define the remote executors,introspect the subschemas,etc.
  return stitchSchemas({
    subschemas: [
      {
        schema: postSubschema,executor: postExecutor,batch: true,},{
        schema: userSubschema,executor: userExecutor,],typeDefs: `
    ...
    extend type User {
      posts: [Post]
      batchPostsJSON: JSON
      batchPosts: [Post]
    }
    ...
  `,resolvers: {
      User: {
        posts: {
          selectionSet: "{ id }",resolve(user,args,context,info) {
            return delegateToSchema({
              schema: schemaPost,operation: "query",fieldName: "postsByUserId",args: { id: user.id },info,});
          },batchPostsJSON: {
          selectionSet: "{ id }",info) {
            return batchDelegateToSchema({
              schema: schemaFavorite,fieldName: "postsByUserIds",key: user.id,argsFromKeys: (ids) => ({ ids }),valuesFromResults: (results,keys) => {
                return keys.map((id) => {
                  return results.filter((f) => f.user_id === id);
                });
              },batchPosts: {
          selectionSet: "{ id }",info) {
            return batchDelegateToSchema({
              schema: schemaPost,keys) => {
                // doesn't matter,we don't get here
              },});
}

在上面的示例代码中,我有三种方法可以获取与用户关联的帖子:

1:User.posts

这工作正常,但没有批量

2:User.batchPostsJSON

这是非常好的批处理,并且可以完美地解决一个问题:JSON 返回类型不允许我查询 Post 字段 - 无论如何我都会得到所有这些字段。更糟糕的是,如果 Post 与第三种类型有关,我将无法遵循这种关系。

3:User.batchPosts

这允许我查询 Post 的字段,但抛出异常 - 我已将返回类型定义为 Post 数组,但是 JSON 是返回的内容,我得到网关错误。

有没有办法处理子模式返回的 JSON 并假装我真的得到 [Post] 代替?当我的 valueFromResults 完成时,这就是它的样子。问题是我的 typedef 和实际解析器之间的返回类型不匹配会在我有机会重新格式化返回值之前引发错误。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...