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 时如何在文档界面中定义静态猫鼬方法?
如何使用 Jest 在 NestJS 的提供者中模拟和监视“mongoose.connect”
使用 Schema First 方法和 NestJS 在 Mongoose 中填充查询