An error occurs in the following configuration. Please tell me the cause of the error and how to fix it.
Error: Cannot determine GraphQL input type for 'zzzzzInputs' of 'XxxxxInput' class. Is the value, that is used as its TS type or explicit type, decorated with a proper decorator or is it a proper input value?
Clone
git clone https://github.com/isoittech/hellpj-type-graphql
Execute commands
npm ci
npm run start
https://github.com/isoittech/hellpj-type-graphql/blob/master/src/main/graphql/ppppp.resolver.ts
@ObjectType()
export class ZzzzzInput {
@Field((type) => ZzzzzType)
zzzzz!: ZzzzzType;
// @Field()
// zzzzz!: string;
}
@InputType()
export class XxxxxInput {
@Field((type) => [ZzzzzInput])
zzzzzInputs!: ZzzzzInput[];
// @Field((type) => [String])
// zzzzzInputs!: string[];
}
@Resolver((of) => Yyyyy)
export class XxxxxResolver {
@Mutation((returns) => Yyyyy)
async addXxxxx(@Arg("Xxxxx") XxxxxInput: XxxxxInput): Promise<Yyyyy> {
const serviceOutput: XxxxxServiceOutputDto = {};
return Promise.resolve(serviceOutput.addedXxxxx!);
}
}
https://typegraphql.com/docs/types-and-fields.html
Cannot determine GraphQL input type for argument named
I solved my problem by modifying like below. Look at '★'.
(And found another one, solved too.)
// @ObjectType() // ★ Before
@InputType() // ★ After
export class ZzzzzInput {
@Field((type) => ZzzzzType)
zzzzz!: ZzzzzType;
// @Field()
// zzzzz!: string;
}
@InputType()
export class XxxxxInput {
@Field((type) => [ZzzzzInput])
zzzzzInputs!: ZzzzzInput[];
// @Field((type) => [String])
// zzzzzInputs!: string[];
}
@Resolver((of) => Yyyyy)
export class XxxxxResolver {
@Mutation((returns) => Yyyyy)
async addXxxxx(@Arg("Xxxxx") XxxxxInput: XxxxxInput): Promise<Yyyyy> {
const serviceOutput: XxxxxServiceOutputDto = {};
return Promise.resolve(serviceOutput.addedXxxxx!);
}
}
node_modules/type-graphql/dist/schema/schema-generator.js
static getGraphQLInputType(target, propertyName, type, typeOptions = {}, parameterIndex, argName) {
let gqlType;
gqlType = types_1.convertTypeIfScalar(type);
if (!gqlType) {
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
★ Finding process below not worked when @ObjectType.
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
const inputType = this.inputTypesInfo.find(it => it.target === type);
if (inputType) {
gqlType = inputType.type;
}
}
if (!gqlType) {
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
☆ Finding process below not worked when wrong order in src/index.ts.
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
const enumType = this.enumTypesInfo.find(it => it.enumObj === type);
if (enumType) {
gqlType = enumType.type;
}
}
if (!gqlType) {
throw new errors_1.CannotDetermineGraphQLTypeError("input", target.name, propertyName, parameterIndex, argName);
}
const { nullableByDefault } = build_context_1.BuildContext;
return types_1.wrapWithTypeOptions(target, propertyName, gqlType, typeOptions, nullableByDefault);
}
After I've solved above problem, another one occured. Error message is below:
Error: Cannot determine GraphQL input type for 'zzzzz' of 'ZzzzzInput' class. Is the value, that is used as its TS type or explicit type, decorated with a proper decorator or is it a proper input value?
Look at ☆ in schema-generator.js.
Enum type 'ZzzzzType' couldn't be found, so error occured.
Because this.enumTypesInfo
doesn't contain 'ZzzzzType'.
Because I executed registering Enumtype after SchemaGenerating process.
I had to modify below.
// enable Enum
registerEnumType(ZzzzzType, {
name: "ZzzzzType",
});
const schema = await buildSchema({
resolvers: [__dirname + "/graphql/*.resolver.ts"],
emitSchemaFile: true,
validate: false,
});
// // enable Enum
// registerEnumType(ZzzzzType, {
// name: "ZzzzzType",
// });