Я создаю сервер graphql с гнездом js + graphql + typeORM + mongoDB.
Я просто не могу выполнить запрос, получая запрос с ObjectID (id mongoDB). И с приведенным ниже примером у меня есть эта ошибка
UnhandledPromiseRejectionWarning: Error: You need to provide explicit type for DemandResolver#demand parameter #0 !
objectId.scalar.ts
import {Kind} from 'graphql';
import {CustomScalar, Scalar} from '@nestjs/graphql';
import {ObjectID} from 'typeorm';
@Scalar('ObjectID', type => ObjectID)
export class ObjectIDScalar implements CustomScalar<string, ObjectID> {
description = 'Mongo object id scalar type';
parseValue(value: string) {
return new ObjectID(value); // value from the client input variables
}
serialize(value: ObjectID) {
return value.toHexString(); // value sent to the client
}
parseLiteral(ast) {
if (ast.kind === Kind.STRING) {
return new ObjectID(ast.value); // value from the client query
}
return null;
}
}
demand.ts
import {Field, InputType, ObjectType} from 'type-graphql';
import {Column, Entity, ObjectID, ObjectIdColumn} from 'typeorm';
@Entity()
@ObjectType()
@InputType('DemandInput')
export class Demand {
@Field(type => ObjectID, { nullable: true })
@ObjectIdColumn()
id?: ObjectID;
@Field({ nullable: true })
@Column({ nullable: true })
name?: string;
}
demand.module.ts
import {Module} from '@nestjs/common';
import {DemandResolver} from './demand.resolver';
import {DemandService} from './demand.service';
import {TypeOrmModule} from '@nestjs/typeorm';
import {Demand} from './demand';
import {ObjectIDScalar} from '../scalars/objectId.scalar';
@Module({
imports: [TypeOrmModule.forFeature([Demand])],
providers: [DemandResolver, DemandService, ObjectIDScalar],
})
export class DemandModule {}
demand.resolver.ts
import {Args, Mutation, Query, Resolver} from '@nestjs/graphql';
import {Demand} from '/demand';
import {DemandService} from './demand.service';
import {ObjectID} from 'typeorm';
@Resolver(Demand)
export class DemandResolver {
constructor(private readonly demandService: DemandService) { }
@Query(() => Demand)
async demand(@Args('id') id: ObjectID) {
return await this.demandService.findById(id);
}
}
спрос .service.ts
import {Injectable} from '@nestjs/common';
import {InjectRepository} from '@nestjs/typeorm';
import {Demand} from '/demand';
import {MongoRepository, ObjectID} from 'typeorm';
@Injectable()
export class DemandService {
constructor(
@InjectRepository(Demand) private readonly demandRepository: MongoRepository<Demand>,
) {}
async findById(id: ObjectID) {
return this.demandRepository.findOne(id);
}
}
Надеюсь, вы поможете мне понять. Я пытаюсь заменить ObjectID на строку в резольвере и сервисе, и это работает, но у меня есть другая ошибка
@Query(() => Demand)
async demand(@Args('id') id: string) {
return await this.demandService.findById(id);
}
UnhandledPromiseRejectionWarning: Error: Cannot determine GraphQL output type for id