首页 > 解决方案 > 如何使用 typeorm 和 apollo 在 graphql 上返回自定义错误

问题描述

您好,我正在尝试返回错误自定义用户创建的示例并且电子邮件存在:

{
  "errors": [
    {
      "message": "The email exists",
      "statusCode": "400"
    }
  ],
  "data": null
}

我现在有这个:

我的 APP.TS

export async function startServer() {
  const app = express();
  const schema = await createSchema();
  useContainer(Container);
  const connection = await createConnection();
  const server = new ApolloServer({
    schema,
    context: ({ req, res }: any) => ({ req, res }),
  });
  server.applyMiddleware({ app });
  return app;
}

解析器.TS

@Resolver()
export class CreateUserResolver {
  //dependency inject
  constructor(private readonly userService: UserService) {}

  //create User Mutaton
  @Mutation(() => User)
  async register(
    @Arg('data')
    data: RegisterInput,
  ): Promise<Partial<User> | Object> {
    const user = this.userService.findOrCreate(data);
    return user;
  }
}

输入:

@InputType()
export class RegisterInput {
  @Field()
  @IsEmail({}, { message: 'Invalid email' })
  email: string;

  @Field()
  @Length(1, 255)
  name: string;

  @Field()
  password: string;
}

服务:

constructor(
    @InjectRepository(User)
    private userRep: Repository<User>,
  ) {}

  async findOrCreate(data: Partial<User>): Promise<Partial<User> | Object> {
    let user = await this.userRep.findOne({ where: { email: data.email } });
    if (user) throw new Error('user already exists');
    data.password = await bcrypt.hash(data.password, 12);
    user = await this.userRep.save({
      ...data,
    });
    return user;
  }

目前我发现的唯一解决方案是使用:

if (user) throw new Error ('用户已经存在');

但我无法想象如何使用状态码或只返回错误消息而不是所有这些消息:

在此处输入图像描述

标签: typescriptgraphqltypeorm

解决方案


您正在以正确的方式进行操作。你应该坚持 Apollo 产生的错误,因为它是一个 graphql 标准。当然,您不想向最终用户显示堆栈跟踪。要为生产禁用堆栈跟踪,请传递debug: false给 Apollo Server 构造函数。

来源:https ://www.apollographql.com/docs/apollo-server/data/errors/


推荐阅读