Apollo GraphQL 解析器类型签名中的 info 参数为空 [英] info argument is empty in Apollo GraphQL resolver type signature

查看:37
本文介绍了Apollo GraphQL 解析器类型签名中的 info 参数为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm working on this library https://github.com/ilyaskarim/wertik-js called Wertik JS to make GraphQL + Rest API more easily, In resolvers, when I console log info, it shows undefined. For each module, I have created dynamic resolvers to make things more easy for developers who will use this library.

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

信息在 Apollo 服务器文档中描述 https://www.apollographql.com/docs/apollo-server/essentials/data/#resolver-type-signature,其中说:此参数包含有关查询执行状态的信息,包括字段名称,从根到字段的路径等等.不幸的是,对我来说,它变得不确定.

The info is described in Apollo Server Documentation https://www.apollographql.com/docs/apollo-server/essentials/data/#resolver-type-signature, Which says: This argument contains information about the execution state of the query, including the field name, the path to the field from the root, and more. For me, unfortunately, it is getting undefined.

重现问题:

  1. 下载https://github.com/ilyaskarim/wertik-js/tree/发展
  2. 纱线安装
  3. 转到示例/演示
  4. 运行node index.js
  5. 现在去http://localhost:1209/
  6. 输入此变更,例如:

  1. Download https://github.com/ilyaskarim/wertik-js/tree/development
  2. Yarn install
  3. Go to examples/demo
  4. Run node index.js
  5. Now go to http://localhost:1209/
  6. Enter this mutation for example:

突变{创建角色(输入:{名称:Asd"}){姓名}}

mutation { createRole(input: {name: "Asd"}) { name } }

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

This is how I setup the application:

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}`);
  });
}

可能的原因是什么?

推荐答案

您正在截断解析器接收到的参数 这个模块.如果您需要为某个对象属性分配一个函数,最好这样做:

You're truncating the parameters received by the resolvers inside this module. If you need to assign a function to some object property, it's much better to just do it like this:

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

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

This is not only more succinct, but it also means you don't risk accidentally leaving off a parameter, which is what happened here.

这篇关于Apollo GraphQL 解析器类型签名中的 info 参数为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆