0
votes

Pourquoi les arguments gérés par type-graphql arrivent-ils toujours comme indéfinis?

Je constate un comportement vraiment inhabituel dans un projet de type graphql.

J'ai suivi la documentation ici https://typegraphql.com/docs/resolvers.html pour lier un peu de GQL dans une fonction JS, mais l'objet est simplement vide lorsqu'il entre dans la fonction. Je ne sais vraiment pas pourquoi il fait cela.

Étant donné cette classe de type:

  {
    bar: undefined,
    baz: undefined,
    buzz: undefined
  }

Et cette fonction de requête:

{
  foos(
    bar:true,
    baz:1,
    buzz:2,
  ) {
    _key
    }
}


1 commentaires

Utilisez-vous également par hasard des modules GraphQL?


3 Réponses :


1
votes

me va bien, je l'ai testé et cela a très bien fonctionné, peut-être que c'est quelque chose lié à votre configuration de typeGraphql typescipt, il pourrait être utile de vérifier la documentation de configuration de TypeGraphql ts.

Un problème que j'ai remarqué et qui pourrait être lié est que lorsque j'utilise babel pour compiler un projet TypeGraphql, la déstructuration des objets dans @Args et @Arg ne fonctionnera pas correctement

alors peut-être que cela pourrait fonctionner à la place dans votre cas

@Query((returns) => Boolean, { name: 'foo' })
async getFoos(@Args() args: GetFoosArgs): Promise<boolean> {
    console.log(args);
    return true;
}

La chose étrange est que graphql est strict et l'idée que votre résolveur a compilé avec succès, vous pouvez exécuter la requête sans erreur, mais vous obtenez cette sortie est un un peu déroutant donc je ne suis pas sûr si SO sera utile dans votre cas, du moins pas sans plus d'informations.

notez également que votre code publié contient des erreurs comme une requête utilisant foos code > quand il devrait être toto alors veuillez lire comment inclure MVCE dans votre question qui sera plus utile pour r autres pour déboguer le problème.

P.S. J'utilise TypeGraphql v0.17.6


0 commentaires

0
votes

Assurez-vous d'avoir installé le package babel-plugin-transform-typescript-metadata via npm ( entrez la description du lien ici .

Vous pouvez en savoir plus sur les options du compilateur Babel + TypeScript ici .

Dans mon cas, les arguments ne sont jamais apparus dans mon schéma émis en premier lieu (j'ai vérifié via l'option emitSchemaFile pour buildSchema ). Installer le plugin mentionné et l'ajouter à la section plugins de mon .babelrc a corrigé le problème.


0 commentaires

0
votes

Ok, je ne suis pas tout à fait sûr de la nature du problème, mais j'ai un peu changé les choses et la magie fonctionne maintenant.

La chose clé à noter est qu'avant, j'utilisais le Arg décorateur de type-graphql , et maintenant j'utilise le décorateur Args de @ nestjs / graphql . P >

Ancien code:

import {
    Resolver,
    Query,
    Parent,
    ResolveProperty,
    Mutation,
    Args,
    Context,
} from '@nestjs/graphql';

@Query(_returns => [Intent], { name: 'intents' })
    async getIntents(
        @Args({ name: 'getIntentsArgs', type: () => GetIntentsArgs }) 
getIntentsArgs: GetIntentsArgs,
    ): Promise<Intent[]> {
        return this.intentsService.getIntents(getIntentsArgs);
}

@InputType()
export class GetIntentsArgs implements IGetIntentsArgs {
    @Field()
    @IsBoolean()
    @IsOptional()
    displayTest?: boolean = false;

    @Field()
    @IsNumberString()
    @IsOptional()
    skip?: number = 0;

    @Field()
    @IsNumberString()
    @IsOptional()
    take?: number = 100;

    @Field()
    @IsString()
    @IsOptional()
    sortColumn?: string = 'intent._key';

    @Field()
    @IsString()
    @IsOptional()
    sortDirection?: string = 'asc';
    
    @Field(_ => [Filter])
    @Type(_ => Filter)
    @IsOptional()
    filters?: Filter[] = [];
    Filter[] = [];
}

Nouveau code:

import { InputType, Field, Int, Arg, ID } from 'type-graphql';

@Query(_returns => [Intent], { name: 'intents' })
    async getIntents(
        @Arg('getIntentsArgs', () => GetIntentsArgs, {
            nullable: true,
            defaultValue: {},
        })
        getIntentsArgs: GetIntentsArgs,
    ): Promise<Intent[]> {
}

@InputType()
export class GetIntentsArgs implements IGetIntentsArgs {
    @Field(() => Boolean, { nullable: true, defaultValue: false })
    displayTest?: boolean;

    @Field(() => Int, { nullable: true, defaultValue: 0 })
    skip?: number;

    @Field(() => Int, { nullable: true, defaultValue: 100 })
    take?: number;

    @Field(() => String, { nullable: true, defaultValue: 'intent._key' })
    sortColumn?: string;

    @Field(() => String, { nullable: true, defaultValue: 'asc' })
    sortDirection?: string;

    @Field(() => [Filter], { nullable: true, defaultValue: [] })
    filters?: IFilter[];
}


0 commentaires