使用TypeScript构建GraphQL API:逐步教程——第3部分

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

GraphQL API 与 TypeScript:逐步指南 — 第 3 部分



在本指南的前几部分中,我们探讨了在 TypeScript 上创建 GraphQL 服务器的基础知识,并学会了如何设置简单的查询。在这最后一部分中,我们将深入研究高级技术:变更、订阅和错误处理。如果您正在学习 TypeScript 入门并希望掌握现代 API 编程,本材料将是向前迈出的重要一步。整个学习过程基于实际示例,您可以立即将其应用到自己的项目中。



1. 使用 TypeScript 实现变更



变更是数据修改操作(创建、更新、删除)。在 GraphQL 中,它们用关键字 mutation 表示。让我们创建一个用于添加新用户的变更。



首先,在 GraphQL 模式中定义类型:



type Mutation {  addUser(name: String!, email: String!): User!}


现在用 TypeScript 实现解析器。请注意严格的类型化:



import { Resolver, Mutation, Arg } from 'type-graphql';import { User } from '../entities/User';

@Resolver()export class UserResolver { @Mutation(() => User) async addUser( @Arg('name') name: string, @Arg('email') email: string ): Promise<User> { const user = new User(); user.name = name; user.email = email; await user.save(); return user; }}


重要提示:在 TypeScript 中,我们使用来自 type-graphql 库的 @Mutation 和 @Arg 装饰器,这使得代码干净且类型安全。这对于大型项目的 编程 尤其有用,因为可预测性很重要。



2. 用于实时更新的订阅



订阅允许客户端通过 WebSocket 实时接收更新。在 TypeScript 中,其实现需要对服务器进行额外配置。



让我们添加对新消息的订阅:



import { Subscription, Root } from 'type-graphql';

@Resolver()export class MessageResolver { @Subscription(() => Message, { topics: 'NEW_MESSAGE', }) newMessage(@Root() message: Message): Message { return message; }}


使用 pubSub.publish('NEW_MESSAGE', message) 发布事件。这允许创建实时聊天或通知。订阅是 编程 工具箱中强大的工具,而 TypeScript 通过静态类型化使其实现更加安全。



3. 错误处理与验证



正确的错误处理是可靠 API 的关键。在 TypeScript 中,我们可以使用自定义错误类:



import { ApolloError } from 'apollo-server-express';

export class UserInputError extends ApolloError { constructor(message: string) { super(message, 'USER_INPUT_ERROR'); Object.defineProperty(this, 'name', { value: 'UserInputError' }); }}


在解析器中,我们检查输入数据:



@Mutation(() => User)async createUser(@Arg('email') email: string) {  if (!email.includes('@')) {    throw new UserInputError('邮箱格式无效');  }  // ... 创建逻辑}


您也可以使用 class-validator 的验证装饰器:



import { IsEmail, Length } from 'class-validator';

class CreateUserInput { @Length(2, 50) name: string;

@IsEmail() email: string;}


我特别推荐对 TypeScript 入门 用户使用这种方法,因为它可以自动化数据验证并减少错误数量。



4. 性能优化



对于生产级项目,避免 N+1 问题很重要。使用 DataLoader 来

博客

书籍推荐