Why I get "UnhandledPromiseRejectionWarning: Error: Undefined type error. Make sure are providing an explicit type" even after I have specified type?

Viewed 710

create method is working well. No errors. But I need a way to insert a large number of records at once. That's why I'm trying to use the createQueryBuilder.

What is the reason for it to say Undefined type error? I have already defined the type as Boolean.

This is my resolver


@Resolver(() => Vehicle)
export class VehicleResolver {
  constructor(private vehicleService: VehicleService) {}

  @Mutation(() => Vehicle, { name: 'createVehicle' })
  create(@Args('vehicleInput') vehicle: VehicleCreateDTO) {
    return this.vehicleService.create(vehicle);
  }

  @Mutation(() => Boolean, { name: 'createVehicleBulk' })
  async createVehicleBulk(@Args('vehiclesInput') vehicles: [VehicleCreateDTO]) {
    const res = await this.vehicleService
      .createBulk(vehicles)
      .catch((err) => console.log(err));
    if (res) return true;
    else return false;
  }
}

This is my service


@Injectable()
export class VehicleService {
  constructor(
    @InjectRepository(Vehicle) private vehicleRepo: Repository<Vehicle>,
  ) {}

  create(vehicle: VehicleCreateDTO): Promise<Vehicle> {
    const vcl = this.vehicleRepo.create(vehicle);
    return this.vehicleRepo.save(vcl);
  }

  async createBulk(vehicles: VehicleCreateDTO[]): Promise<InsertResult> {
    const res = await this.vehicleRepo
      .createQueryBuilder()
      .insert()
      .into('vehicle')
      .values(vehicles)
      .execute();
    return res;
  }
}

I want to save an array of objects of type VehicleCreateDTO. But I get the following error.

(node:11464) UnhandledPromiseRejectionWarning: Error: Undefined type error. Make sure you are providing an explicit type for the "createBulk" (parameter at index [0]) of the "VehicleResolver" class.
    at Object.reflectTypeFromMetadata (E:\COL\backend\vehicle-service-insert\node_modules\@nestjs\graphql\dist\utils\reflection.utilts.js:15:15) 
    at E:\COL\backend\vehicle-service-insert\node_modules\@nestjs\graphql\dist\decorators\args.decorator.js:17:78
    at E:\COL\backend\vehicle-service-insert\node_modules\@nestjs\graphql\dist\schema-builder\storages\lazy-metadata.storage.js:36:44
    at Array.forEach (<anonymous>)
    at LazyMetadataStorageHost.load (E:\COL\backend\vehicle-service-insert\node_modules\@nestjs\graphql\dist\schema-builder\storages\lazy-metadata.storage.js:36:26)
    at GraphQLSchemaFactory.<anonymous> (E:\COL\backend\vehicle-service-insert\node_modules\@nestjs\graphql\dist\schema-builder\graphql-schema.factory.js:37:57)
    at Generator.next (<anonymous>)
    at E:\COL\backend\vehicle-service-insert\node_modules\@nestjs\graphql\node_modules\tslib\tslib.js:117:75
    at new Promise (<anonymous>)
    at Object.__awaiter (E:\COL\backend\vehicle-service-insert\node_modules\@nestjs\graphql\node_modules\tslib\tslib.js:113:16)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:11464) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
(node:11464) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.


1 Answers

The notation of your input type argument seems to be wrong. Also the error message seems to be misleading if I look closely it states

...type for the "createBulk" (parameter at index [0]) of the "VehicleResolver" class...

but in your resolver you have only the mutations createVehicle and createVehicleBulk, so I assume it's the createVehicleBulk mutation where the error is.

Just change:

  @Mutation(() => Boolean, { name: 'createVehicleBulk' })
  async createVehicleBulk(@Args('vehiclesInput') vehicles: [VehicleCreateDTO]) {
    const res = await this.vehicleService
      .createBulk(vehicles)
      .catch((err) => console.log(err));
    if (res) return true;
    else return false;
  }

to

  @Mutation(() => Boolean, { name: 'createVehicleBulk' })
  async createVehicleBulk(@Args({ name: 'vehiclesInput', type: () => [VehicleCreateDTO]}) vehicles: VehicleCreateDTO[]) {
    const res = await this.vehicleService
      .createBulk(vehicles)
      .catch((err) => console.log(err));
    if (res) return true;
    else return false;
  }

I had a similar issue and this answer helped me to find a solution

Related