为什么graphql类型处理的参数总是未定义
我在类型graphql项目中看到了一些非常不寻常的行为 我已经按照这里的文档将一些GQL链接到JS函数中,但是当对象进入函数时,它只是空的。我真的不知道它为什么这么做 给定此类型类别:为什么graphql类型处理的参数总是未定义,graphql,typegraphql,Graphql,Typegraphql,我在类型graphql项目中看到了一些非常不寻常的行为 我已经按照这里的文档将一些GQL链接到JS函数中,但是当对象进入函数时,它只是空的。我真的不知道它为什么这么做 给定此类型类别: @ArgsType() export class GetFoosArgs implements IGetFoosArgs { @Field(() => Boolean, { nullable: true, defaultValue: false }) bar?: boolean; @Field
@ArgsType()
export class GetFoosArgs implements IGetFoosArgs {
@Field(() => Boolean, { nullable: true, defaultValue: false })
bar?: boolean;
@Field(() => Int, { nullable: true, defaultValue: 0 })
baz?: number;
@Field(() => Int, { nullable: true, defaultValue: 100 })
buzz?: number;
}
此查询功能:
@Query(_returns => [Foo], { name: 'foo' })
async getFoos(@Args() {
bar,
baz,
buzz
}: GetFoosArgs): Promise<Foo[]> {
console.log({
foo,
baz,
buzz,
});
}
控制台转储只显示:
{
bar: undefined,
baz: undefined,
buzz: undefined
}
:-S我觉得不错,我测试了它,它工作得很好,也许它与您的TypeGraphql typescipt设置有关,检查TypeGraphql ts配置文档可能会有所帮助 我注意到并可能与之相关的一个问题是,当我使用babel编译TypeGraphql项目时,
@Args
和@Arg
中的对象解构将无法正常工作
所以,也许在你的情况下,试试这个可能会奏效
@Query((返回)=>Boolean,{name:'foo'})
异步getFoos(@Args()Args:GetFoosArgs):承诺{
console.log(args);
返回true;
}
奇怪的是graphql是严格的,并且您的解析器编译成功后就可以运行查询而不出错,但是您得到的这个输出有点混乱,所以我不确定这样做是否对您的情况有帮助,至少在没有更多信息的情况下是这样
另外请注意,您发布的代码中包含一些错误,例如在应该是foo
时使用foos
进行查询,因此请阅读如何在您的问题中包含对其他人调试问题更有帮助的内容
另外,我正在使用TypeGraphql v0.17.6请确保您已通过npm安装了
babel插件转换typescript元数据
包
您可以阅读有关Babel+TypeScript编译器选项的更多信息
在我的例子中,args从一开始就没有出现在我发出的模式中(我通过
emitSchemaFile
选项检查buildSchema
)安装所提到的插件,并将其添加到我的的插件部分。babelrc
修复了它。好的,不完全确定问题的性质,但我已经改变了一些,魔法正在发挥作用
需要注意的关键是,以前我使用的是type graphql
中的Arg
装饰器,现在我使用的是@nestjs/graphql
中的Args
装饰器
旧代码:
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[];
}
从'type graphql'导入{InputType,Field,Int,Arg,ID};
@查询(_返回=>[Intent],{name:'intents'})
异步getIntents(
@Arg('getIntentsArgs',()=>getIntentsArgs{
可为空:是的,
默认值:{},
})
getIntentsArgs:getIntentsArgs,
):承诺{
}
@InputType()
导出类GetIntentsArgs实现IGetIntentsArgs{
@字段(()=>Boolean,{nullable:true,defaultValue:false})
displayTest?:布尔值;
@字段(()=>Int,{nullable:true,defaultValue:0})
跳过?:数字;
@字段(()=>Int,{nullable:true,defaultValue:100})
取?:数字;
@字段(()=>字符串,{nullable:true,defaultValue:'intent.\u key'})
sortColumn?:字符串;
@字段(()=>字符串,{nullable:true,defaultValue:'asc'})
sortDirection?:字符串;
@字段(()=>[Filter],{nullable:true,defaultValue:[]})
过滤器?:IFilter[];
}
新代码:
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[] = [];
}
导入{
分解器,
查询
父母亲
解决财产问题,
突变
Args,
上下文
}来自“@nestjs/graphql”;
@查询(_返回=>[Intent],{name:'intents'})
异步getIntents(
@Args({name:'getIntentsArgs',类型:()=>getIntentsArgs})
getIntentsArgs:getIntentsArgs,
):承诺{
返回此.intentsService.getIntents(getIntentsArgs);
}
@InputType()
导出类GetIntentsArgs实现IGetIntentsArgs{
@字段()
@IsBoolean()
@等民族()
displayTest?:布尔值=假;
@字段()
@IsNumberString()
@等民族()
跳过?:数字=0;
@字段()
@IsNumberString()
@等民族()
取?:数字=100;
@字段()
@IsString()
@等民族()
sortColumn?:字符串='intent.'U key';
@字段()
@IsString()
@等民族()
sortDirection?:字符串='asc';
@字段(=>[Filter])
@类型(=>Filter)
@等民族()
过滤器?:过滤器[]=[];
过滤器[]=[];
}
您是否碰巧也在使用GraphQL模块?
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[] = [];
}