当前位置: 首页 > 知识库问答 >
问题:

Apollo GraphQL解析器类型签名中info参数为空

慕云
2023-03-14

我正在这个名为Wertik JShttps://github.com/ilyaskarim/wertik-js库上工作,以使GraphQL Rest API更容易,在解析器中,当我控制台日志info时,它显示未定义。对于每个模块,我都创建了动态解析器,让使用这个库的开发人员更容易。

let object = {
    create: async (_:any, args:any, context:any,info: any) => {
      console.log(info); // This will be undefined
      let v = await validate(validations.create,args.input);
      let {success} = v;
      if (!success) {
        throw new ApolloError("Validation error",statusCodes.BAD_REQUEST.number,{list: v.errors})
      }
      try {
        let createModel = await model.create(args.input);
        pubsub.publish(`${camelCase(moduleName)}Created`, { [`${camelCase(moduleName)}Created`]: createModel });
        return createModel;
      } catch (e) {
        return internalServerError(e);
      }
    },
}

行:https://github.com/ilyaskarim/wertik-js/blob/ec813f49a14ddd6a04680b261ae4ef2aadc2b1a5/src/framework/dynamic/resolvers.ts#L102

阿波罗服务器文档中描述了该信息https://www.apollographql.com/docs/apollo-server/essentials/data/#resolver-类型签名,表示:此参数包含有关查询执行状态的信息,包括字段名、从根到字段的路径等。对我来说,不幸的是,它正在变得不明确。

复制该问题:

>

  • 下载https://github.com/ilyaskarim/wertik-js/tree/development
  • 纱线安装
  • 转到示例/演示
  • 运行节点index.js
  • 现在去http://localhost:1209/
  • 输入此突变,例如:

    突变{createRole(输入:{name:"Asd"}){name}

    以下是我设置应用程序的方式:

    const { ApolloServer } = require('apollo-server');
    
    import mutations from "./loadAllMutations";
    import queries from "./loadAllQueries";
    import resolvers from "./loadAllResolvers";
    import subscriptions from "./loadAllSubscriptions";
    import schemas from "./loadAllSchemas";
    import generalSchema from "./../helpers/generalSchema";
    
    export default function (rootDirectory: string,app: any,configuration: object) {
      let allMutations = mutations(rootDirectory);
      let allQueries=  queries(rootDirectory);
      let allSchemas = schemas(rootDirectory);
      let allResolvers = resolvers(rootDirectory);
      let allSubscriptions = subscriptions(rootDirectory);
      let {validateAccessToken} = require(`${rootDirectory}/framework/predefinedModules/user/auth`).default;
      let mainSchema  = `
        ${generalSchema}
        ${allSchemas}
        type Subscription {
          ${allSubscriptions}
        }
        type Mutation {
          ${allMutations}
        }
        type Query {
          ${allQueries}
        }
        schema {
          query: Query
          mutation: Mutation
          subscription: Subscription
        }
      `;
      const server = new ApolloServer({ 
        typeDefs: mainSchema, 
        resolvers: allResolvers,
        context: async (a: any) => {
          await validateAccessToken(a.req);
        }
      });
      server.listen(1209).then(({ url, subscriptionsUrl }) => {
        console.log(`Server ready at ${url}`);
        console.log(`Subscriptions ready at ${subscriptionsUrl}`);
      });
    }
    

    可能的原因是什么?

  • 共有1个答案

    汪飞捷
    2023-03-14

    您正在截断此模块内解析程序接收的参数。如果需要将函数指定给某个对象属性,最好是这样做:

    mutations: {
      [`create${moduleName}`]: mutations[`create${moduleName}`],
    },
    

    这不仅更加简洁,而且意味着您不会冒险意外遗漏参数,这就是这里发生的情况。

     类似资料:
    • 一开始,我有一个简单的解析器类型: 我在左侧使用其中一个表示错误消息,在右侧使用解析表达式和其余标记。 此函数“解包”解析器函数。 我的目标是使解析器更加通用,使其不仅将令牌作为输入。所以我使用了pragma并将其更改为: 我想知道的是:“parse”函数现在有什么类型? 我无法弄清楚,也无法推断。GHCi给出了这个错误: 谢谢你的帮助。 编辑:非常感谢您的回答。 我之所以希望该类型看起来像“Pa

    • 当我定义一个类时,我如何在它的方法签名中包含必须属于同一类的参数?我正在构建一个应该这样工作的图结构,但是这里有一个简化的例子: 这将导致以下错误: 我的意思是,我可以用Python 2的方式来做,但是我希望有比这更Python-3-ic的解决方案:

    • 以下签名是有效的,在Scala中是常用的: 但是,由于是Java中的Scala等价物,所以转换此签名的第一个想法(用替换函数类型,并使用Use-Site方差注释,也就是有界通配符)是 但是哦不!编译器抱怨中的标记,因为您不能有下限类型变量!现在,我如何在Java代码中编写这个方法,而不必穿越时间回到泛型在Java世界中还不存在的时候呢? 是的,我知道您认为我可以使用,但这不是一回事,如我的实现所示

    • 问题内容: 我知道hibernate最近在3.6中重做了它的类型系统。我认为这现在允许您将Java类与类型(或UserType)相关联。例如,我使用joda- time并具有几个UserType,它们将LocalDate和LocalDateTime映射到适当的SQL类型。 当使用对象时,这很好用,但是如果我想传递一个joda类型作为HQL参数,hibernate就会感到困惑,所以我必须记得每次打电

    • 问题总结:我想传递一个带有类型参数(如

    • 问题内容: 我知道休眠最近在3.6中重做了它的类型系统。我认为这现在允许您将Java类与类型(或UserType)相关联。例如,我使用joda- time并具有几个UserType,它们将LocalDate和LocalDateTime映射到适当的SQL类型。 当使用对象时,这很好用,但是如果我想传递一个joda类型作为HQL参数,hibernate会感到困惑,所以我必须记住每次打电话时都要提供Ty