在 Web 开发领域,构建一个可扩展的 RESTful API 是一个常见的需求。随着 Typescript 和 NestJS 的流行,我们可以使用它们来快速构建优雅且可扩展的 RESTful API。
Typescript 简介
Typescript 是 Microsoft 推出的一种语言,它是 JavaScript 的超集,可以让你在代码编写阶段就能够检查错误,提高代码健壮性和可读性。使用 Typescript 可以让我们在编写代码时避免一些低级错误,而不必在运行时才发现。这些错误包括变量类型错误,方法调用错误和属性访问错误等等。
NestJS 简介
NestJS 是一个基于 Typescript 的 Web 开发框架,它把一些优秀的 Web 开发实践和设计模式集成到了一个框架中。这些实践和设计模式来自于 Angular 和 Express JS,使得 NestJS 在可扩展性和可维护性方面有着很大的优势。
安装 NestJS
在开始使用 NestJS 之前,你需要安装 Node.js 和 npm。如果你已经具备这些,你可以通过 npm 安装 NestJS CLI。
npm install -g @nestjs/cli
快速创建 NestJS 应用
在安装完 NestJS CLI 后,你可以通过运行以下命令来创建一个新的 NestJS 应用。
nest new my-app
这将会创建一个名为 my-app
的新应用,并自动安装所需的依赖。
构建一个 RESTful API
创建一个 RESTful API 需要执行以下步骤:
- 使用 NestJS CLI 创建一个新的应用。
- 定义数据模型。
- 创建控制器,并定义 HTTP 请求路由(GET、POST、PUT、DELETE)。
- 在 NestJS 中使用依赖注入来调用其他服务。
- 使用 NestJS 中的中间件来处理请求。
- 获取请求参数,并进行验证。
- 处理请求并返回响应。
定义数据模型
在 NestJS 中定义数据模型是很容易的,只需要使用 TypeScript 的类定义数据模型即可。例如,我们有一个用户数据表,它有 id,name 和 email 字段,我们可以创建一个 User 类来定义它。
export class User { id: string; name: string; email: string; }
创建控制器
下一步是创建控制器,该控制器将用于处理 HTTP 请求。为了创建一个控制器,我们可以使用 nest generate
命令来自动生成。
nest generate controller users
这将创建一个名为 users.controller.ts
的文件,并在 app.module.ts
文件中将该控制器添加到应用程序中。
在 users.controller.ts
文件中,我们需要定义一些路由来处理 GET,POST,PUT 和 DELETE 请求。例如:
-- -------------------- ---- ------- ------ - ----------- ---- ----- ---- ------- ----- ----- - ---- ----------------- ------ - ----------- - ---- ----------------- ------ - ---- - ---- --------- -------------------- ------ ----- -------------- - ------------------- -------- ------------ ------------ -- ------ ----- --------- --------------- - ------ -------------------------- - ----------- ----- -------------------- --- -------- ------------- - ------ ----------------------------- - ------- ----- -------------- ----- ------ ------------- - ------ ------------------------------ - ----------- ----- ------------------- --- ------- ------- ----- ------ ------------- - ------ --------------------------- ------ - -------------- ----- ------------------- --- -------- ------------- - ------ ---------------------------- - -
创建服务
接下来,我们需要创建一个服务,该服务将用于处理数据和业务逻辑。我们可以使用 NestJS 的 @Injectable()
装饰器来创建一个服务。例如,我们创建一个 UserService 服务,用于处理用户数据。
-- -------------------- ---- ------- ------ - ---------- - ---- ----------------- ------ - ---- - ---- --------- ------------- ------ ----- ----------- - ------- -------- ------ ------ - --- --------- ------ - ------ ----------- - ----------- -------- ---- - ------ -------------------- -- ------- --- ---- - ------------ ------ ---- - ---------------------- ------ ----- - ---------- ------- ----- ------ ---- - ----- ----- - ------------------------- -- ------- --- ---- ----------------- - ----- ------ ----- - ---------- -------- ---- - ----- ----- - ------------------------- -- ------- --- ---- ----- ---- - ------------------ ------------------------ --- ------ ----- - -
注册服务和控制器
在 NestJS 程序中,我们需要在应用程序模块中注册服务和控制器。我们可以使用 @Module()
装饰器来定义一个应用程序模块,并使用 providers
属性来注册所有依赖服务。
-- -------------------- ---- ------- ------ - ------ - ---- ----------------- ------ - -------------- - ---- -------------------- ------ - ----------- - ---- ----------------- --------- ------------ ----------------- ---------- -------------- -- ------ ----- --------- --
启动应用程序
最后一步是启动应用程序。我们可以使用 NestJS 的 NestFactory
类来启动应用程序。例如,我们可以在 main.ts
文件中将 NestJS 应用程序引导到服务器。
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); await app.listen(3000); } bootstrap();
在上面的例子中,我们创建了一个 NestJS 应用程序并将其启动在 localhost:3000
这个端口上。
使用中间件和请求参数验证
在 NestJS 中,我们可以使用中间件和请求参数验证来处理和验证请求。例如,我们可以创建一个日志记录中间件来记录每个请求的信息,同时使用 class-validator
库来验证请求参数。
-- -------------------- ---- ------- ------ - ----------- -------------- - ---- ----------------- ------ - ------------- -------- -------- - ---- ---------- ------ - ------------ - ---- -------------------- ------ - -------- - ---- ------------------ ------ - ---- - ---- --------- ------------- ------ ----- ----------------- ---------- -------------- - -------- -------- ---- --------- ----- ------------- - ------------------- ---------------------- ------------- --------------------- ------- - - ------------- ------ ----- ------------- - ----- ------- ------ ------- - ------------- ------ ----- ------------- - --- ------- ----- ------- ------ ------- - ------------- ------ ----- ------- - --- ------- ----- ------- ------ ------- - ------------- ------ ----- ---------------------- - ----- ---------------- ----- ---------------- - ----- - --- ----- ----- - - ------ ----- --- - --------------------- - --- ----- ----- --- ----- ------ - ----- -------------- -- --------------- - ----- --- --------------------------- - ------ ---- - - -------------------- ------ ----- -------------- - ------------------- -------- ------------ ------------ -- ------ ----- --------- --------------- - ------ -------------------------- - ----------- ----- -------------------- --- -------- ------------- - ------ ----------------------------- - ------- ----- ---------------- ------------------------- -------- --------------- ------------- - ----- ---- - ------------------ --------- ------ ------------------------------ - ----------- ----- ------------------- --- ------- --------- ------------------------- -------- --------------- ------------- - ----- ---- - ------------------ - --- ---------- --- ------ --------------------------- ------ - -------------- ----- ------------------- --- -------- ------------- - ------ ---------------------------- - -
在上面的例子中,我们使用 class-validator
库来验证用户的请求参数,并使用中间件来记录每个请求的信息。我们还创建了一些 DTO 和管道来处理请求参数,这在处理大型数据时非常有用。
结论
使用 Typescript 和 NestJS 可以加快 RESTful API 的开发速度,并使其具有更好的可维护性和可扩展性。通过深入学习上面的例子,你可以更好的了解这些框架的使用方法和最佳实践。
完整代码见 https://github.com/davidroyer/nestjs-typescript-restful-api。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/677647d76d66e0f9aa1c90aa