为NestJs GraphQL查询装饰器设置多个返回类型
我想使用NestJs创建一个GraphQLAPI。据我所知,我不再为无效请求抛出HTTP异常。因此,我认为我必须创建我自己的“错误代码”,我可以发送回客户端。所以给出这个基本的例子为NestJs GraphQL查询装饰器设置多个返回类型,graphql,nestjs,typegraphql,Graphql,Nestjs,Typegraphql,我想使用NestJs创建一个GraphQLAPI。据我所知,我不再为无效请求抛出HTTP异常。因此,我认为我必须创建我自己的“错误代码”,我可以发送回客户端。所以给出这个基本的例子 @ObjectType() export class ErrorResponse { @Field() message: string; } 我有一个服务函数,可以通过ID返回用户,并且我扩展了返回类型,以便在请求无效时返回错误对象 public async getUserById(id: number
@ObjectType()
export class ErrorResponse {
@Field()
message: string;
}
我有一个服务函数,可以通过ID返回用户,并且我扩展了返回类型,以便在请求无效时返回错误对象
public async getUserById(id: number): Promise<ErrorResponse | User> {
const user: User = await this.usersRepository.findOne(id);
if (!user) {
const errorResponse: ErrorResponse = new ErrorResponse();
errorResponse.message = `User with ID ${id} does not exist`;
return errorResponse;
}
return user;
}
不会这样做,会出现这个错误
算术运算的左侧必须是“any”类型,
'number'、'bigint'或枚举类型.ts(2362)
这就是我针对类似情况提出的解决方案。 GraphQL需要单返回ObjectType。 首先,我创建了一个公共对象
@ObjectType()
export class MutationResult {
@Field({ nullable: true })
success?: boolean;
@Field({ nullable: true })
error?: boolean;
}
然后在用户模块中,我创建了两种对象类型-user
和UserResponse
。在UserResponse上,我扩展了公共MutationResult
对象
@ObjectType()
export class User {
@Field(type => ID)
id: string;
@Field()
name: string;
}
@ObjectType()
export class UserResponse extends MutationResult {
@Field()
result: User;
}
现在在查询中,您可以这样做
mutation {
addUser(name: "Test") {
success,
error,
result {
name
}
}
}
如果
ErrorResponse
和User
都是@ObjectType
,则只需使用createUnionType
将它们“合并”在一起:
嗯,如果只有一种可能,那么这似乎就是答案
@ObjectType()
export class User {
@Field(type => ID)
id: string;
@Field()
name: string;
}
@ObjectType()
export class UserResponse extends MutationResult {
@Field()
result: User;
}
mutation {
addUser(name: "Test") {
success,
error,
result {
name
}
}
}