nestjs : 定义要在 mongoose 和 graphql 中使用的地图/数组

Posted

技术标签:

【中文标题】nestjs : 定义要在 mongoose 和 graphql 中使用的地图/数组【英文标题】:nestjs : Define map/array to be used in mongoose and graphql 【发布时间】:2021-09-21 07:55:13 【问题描述】:

我正在使用nestJs,我正在尝试创建一个突变,它接收一个键值数组作为参数。 另外,我正在定义一个 ObjectType,它将定义 mongoose 模式和 graphql objectType。

    CarName : 数组的数据。 SetCarParams :突变的输入。 Car: mongoose+graphql 架构定义
import  Field, InputType, ObjectType  from '@nestjs/graphql';
import  Prop, Schema, SchemaFactory  from '@nestjs/mongoose';
import  Document  from 'mongoose';

@ObjectType()
export class CarName 
  @Field()
  key: string;

  @Field()
  value: string;


@InputType()
export class SetCarParams 
  @Field(() => [CarName])
  names: CarName[];


@Schema()
@ObjectType()
export class Car 
  @Prop( type: [CarName] )
  @Field(() => [CarName])
  names: CarName[];


export type CarDocument = Car & Document;
export const CarDto = SchemaFactory.createForClass(Car);

@Mutation(() => Car)
  setCar(@Args(camelCase(Car.name)) carParams: SetCarParams) 
    console.log('do something');

我收到的错误:CannotDetermineInputTypeError: Cannot determine a GraphQL input type for the "names". Make sure your class is decorated with an appropriate decorator.

    当我将类型设置为 String 而不是 CarName 时,我的结构可以正常工作。 当我在猫鼬模式中使用原始类型时,它不能正常工作
@Schema()
@ObjectType()
export class Car 
  @Prop(
    raw(
      type: Map,
      of: CarName,
    ),
  )
  @Field(() => [CarName])
  names: CarName[];

    另外,当我尝试不使用 SetCarParams 作为突变的输入类型时,它也不起作用
@Mutation(() => Car)
  setCar(
    @Args('names',  type: () => [ key: String, value: String ] )
    names: [ key: string; value: string ],
  ) 

【问题讨论】:

【参考方案1】:

所以,我发现了问题 - InputType 和 ObjectType 的命名冲突。 当我为它们设置一个确切的命名时,它就像一个魅力。

import  Field, InputType, ObjectType  from '@nestjs/graphql';
import  Prop, Schema, SchemaFactory  from '@nestjs/mongoose';
import  Document  from 'mongoose';

@InputType('CarNameInput')
@ObjectType('CarNameType')
@Schema( versionKey: false, timestamps: true )
export class CarName 
  @Prop()
  @Field(() => String)
  key: string;

  @Prop()
  @Field(() => String)
  value: string;


@InputType('CarInput')
@ObjectType('CarType')
export class Car 
  @Field(() => [CarName])
  carNames: Array<CarName>;


export type CarNameDocument = CarName & Document;
export const CarNameDto = SchemaFactory.createForClass(CarName);
import  Field, ObjectType, Mutation  from '@nestjs/graphql';
import  Schema  from '@nestjs/mongoose';

@ObjectType()
@Schema()
export class Identifier 
  @Field(() => String)
  id: string;


@Mutation(() => Identifier)
async addCar(@Args( name: 'car', type: () => Car ) car: Car) 
  //TODO something

我如何在 graphql 中调用突变:

mutation 
  addCar(
    car: 
      carNames: [
         key: "asdf1", value: "hello" 
         key: "asdf2", value: "world" 
      ]
    
  ) 
    id
  

【讨论】:

以上是关于nestjs : 定义要在 mongoose 和 graphql 中使用的地图/数组的主要内容,如果未能解决你的问题,请参考以下文章

使用@nestjs/mongoose 时如何在文档界面中定义静态猫鼬方法?

NestJS Mongoose 模式继承

如何使用 Jest 在 NestJS 的提供者中模拟和监视“mongoose.connect”

使用 Schema First 方法和 NestJS 在 Mongoose 中填充查询

NestJS + Mongoose + GraphQL:“填充”不起作用

如何在 DTO 中定义 ObjectId 以及在 NestJS Mongoose 中获取关系数据的正确查询是啥?