@ nestjs / graphql Ошибка: необходимо указать явный тип для DemandResolver # параметр спроса # 0 - PullRequest
1 голос
/ 06 февраля 2020

Я создаю сервер 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...