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

本文是小编为大家收集整理的关于在Apollo GraphQL解析器类型签名中,info参数为空的处理/解决方法,可以参考本文帮助大家快速定位并解决问题,中文翻译不准确的可切换到English标签页查看源文。

问题描述

我正在为此图书馆工作 https://github.com/ygithub.com/ilyaskarim/wertaskarim/wertik-js 称为WERTIK JS,以使GraphQl + REST API更轻松,在Resolvers中,当我控制log 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);
      }
    },
}

line:

apollo服务器文档中描述了该信息,它说:此参数包含有关查询的执行状态的信息,包括字段名称,从根部到达田地的路径,等等.对我来说,不幸的是,它变得不确定.

复制问题:

  1. 下载开发
  2. 纱线安装
  3. 去示例/演示
  4. 运行node index.js
  5. 现在转到 http://localhost:1209/
  6. 输入此突变:

    突变{ createrole(输入:{name:" asd"}){ 名称 } }

  7. 该线在此突变上执行

    可能是什么原因?

    推荐答案

    您正在截断此模块.如果您需要为某些对象属性分配函数,那么这样做是更好的选择:

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

    这不仅更为简洁,而且还意味着您不会意外抛弃参数,这就是这里发生的事情.

    本文地址:https://www.itbaoku.cn/post/1938099.html

问题描述

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

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

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.

To reproduce the issue:

  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:

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

  7. This line executes on this mutation https://github.com/ilyaskarim/wertik-js/blob/ec813f49a14ddd6a04680b261ae4ef2aadc2b1a5/src/framework/dynamic/resolvers.ts#L102
  8. And returns undefined on the console.

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

What could be a possible reason?

推荐答案

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.