NestJS是Node.js框架之一,它最近获得了很多开发人员的喜爱和牵引力。本文将教你如何使用NestJS,Prisma,PostgreSQL和Swagger构建后端REST API。
文章目录
- 介绍
- 您将使用的技术
- 先决条件
- 假定的知识
- 开发环境
- 生成 NestJS 项目
- 创建 PostgreSQL 实例
- 设置 Prisma
- 设置环境变量
- 了解 Prisma schema
- 对数据进行建模
- 创建 Prisma 服务
- 设置 Swagger
- 总结
介绍
在本教程中,您将学习如何为名为“Medium”(一个简单的模仿)的博客应用程序构建后端 REST API。您将从创建一个新的 NestJS 项目开始。然后,您将启动自己的PostgreSQL服务器并使用Prisma连接到它。最后,您将构建 REST API 并使用 Swagger 对其进行记录。
您将使用的技术
您将使用以下工具来构建此应用程序:
- NestJS作为后端框架
- Prisma 作为对象关系映射器 (ORM)
- PostgreSQL 作为数据库
- Swagger 作为 API 文档工具的
- TypeScript 作为编程语言
先决条件
假定的知识
这是一个初学者友好的教程。但是,本教程假设:
- JavaScript或TypeScript的基本知识(优先)
- NestJS基础知识
注意:如果你不熟悉 NestJS,你可以按照 NestJS 文档中的概述部分快速学习基础知识。
开发环境
- 安装好 Node.js
- 安装了 Docker 或 PostgreSQL
- 安装了Prisma VSCode Extension(可选)
- 可以访问 Unix shell(如 Linux 和 macOS 中的终端/shell)以运行本系列中提供的命令(可选)
注1:可选的Prisma VSCode扩展为Prisma添加了一些非常好的IntelliSense和语法高亮。
注意 2:如果您没有 Unix shell(例如,您在 Windows 机器上),您仍然可以继续操作,但可能需要为您的机器修改 shell 命令。
生成 NestJS 项目
您需要做的第一件事是安装 NestJS CLI。NestJS CLI 在使用 NestJS 项目时非常方便。它带有内置实用程序,可帮助您初始化,开发和维护NestJS应用程序。
您可以使用 NestJS CLI 创建一个空项目。若要开始,请在希望项目驻留的位置运行以下命令:
npx @nestjs/cli new median
CLI 将提示您为您的项目选择一个包管理器 — 选择 npm。之后,你应该在当前目录中有一个新的 NestJS 项目。
在首选代码编辑器中打开项目(我们建议使用 VSCode)。您应该会看到以下文件:
median
├── node_modules
├── src
│ ├── app.controller.spec.ts
│ ├── app.controller.ts
│ ├── app.module.ts
│ ├── app.service.ts
│ └── main.ts
├── test
│ ├── app.e2e-spec.ts
│ └── jest-e2e.json
├── README.md
├── nest-cli.json
├── package-lock.json
├── package.json
├── tsconfig.build.json
└── tsconfig.json
可以使用以下命令启动项目:
npm run start:dev
此命令将监视您的文件,并在您进行更改时自动重新编译并重新加载服务器。要验证服务器是否正在运行,请转到 URL http://localhost:3000/
。您应该会看到一个空白页面,其中包含消息 'Hello World!'
。
注意:在学习本教程时,应保持服务器在后台运行。
创建 PostgreSQL 实例
您将使用 PostgreSQL 作为 NestJS 应用程序的数据库。本教程将向您展示如何通过 Docker 容器在您的机器上安装和运行 PostgreSQL。
注意:如果您不想使用 Docker,可以原生设置 PostgreSQL 实例或在 Heroku 上获取托管的 PostgreSQL 数据库。
首先,在项目的主文件夹中创建一个 docker-compose.yml
文件:
# docker-compose.yml
version: '3.8'
services:
postgres:
image: postgres:13.5
restart: always
environment:
- POSTGRES_USER=myuser
- POSTGRES_PASSWORD=mypassword
volumes:
- postgres:/var/lib/postgresql/data
ports:
- '5432:5432'
volumes:
postgres:
确保计算机端口 5432
上未运行任何内容。要启动 postgres
容器,请打开一个新的终端窗口,然后在项目的主文件夹中运行以下命令:
docker-compose up
注意:如果关闭终端窗口,它也会停止容器。如果在命令末尾添加一个
-d
选项,则可以避免这种情况,如下所示:docker-compose up -d
。这将在后台无限期地运行容器。
设置 Prisma
要开始使用,请先将 Prisma CLI 安装为开发依赖项。Prisma CLI 将允许您运行各种命令并与您的项目进行交互。
npm install -D prisma
您可以通过运行以下命令在项目中初始化 Prisma:
npx prisma init
这将创建一个包含 schema.prisma
文件的新 prisma
目录。这是包含数据库架构的主配置文件。此命令还会在项目中创建一个 .env
文件。
设置环境变量
在 .env
文件中,应会看到一个 DATABASE_URL
带有虚拟连接字符串的环境变量。将此连接字符串替换为 PostgreSQL 实例的连接字符串。
// .env
DATABASE_URL="postgres://myuser:mypassword@localhost:5432/median-db"
注意:如果未使用 docker(如上一节所示)创建 PostgreSQL 数据库,则连接字符串将与上面显示的连接字符串不同。PostgreSQL 的连接字符串格式可在 Prisma Docs 中找到。
了解 Prisma schema
如果打开 prisma/schema.prisma
,应会看到以下默认架构:
// prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
此文件是用 Prisma 架构语言编写的,Prisma 是用来定义数据库架构的语言。该文件 schema.prisma
有三个主要组件:
- 数据源:指定数据库连接。上述配置意味着您的数据库提供程序是 PostgreSQL,并且数据库连接字符串在
DATABASE_URL
环境变量中可用。 - 生成器:指示要生成 Prisma 客户端,这是数据库的类型安全查询生成器。它用于向数据库发送查询。
- 数据模型:定义数据库模型。每个模型都将映射到基础数据库中的表。现在您的架构中没有模型,您将在下一节中探索此部分。
对数据进行建模
现在是时候为应用程序定义数据模型了。对于本教程,您只需要一个 Article
模型来表示博客上的每篇文章。
在 prisma/prisma.schema
文件中,将一个名为 Article
的新模型添加到架构中:
// prisma/schema.prisma
model Article {
id Int @id @default(autoincrement())
title String @unique
description String?
body String
published Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
该 id
字段具有一个名为 @id
的特殊属性。此属性指示此字段是模型的主键。该 @default(autoincrement())
属性指示此字段应自动递增并分配给任何新创建的记录。
该 published
字段是一个标志,用于指示文章是已发布还是处于草稿模式。该 @default(false)
属性指示默认情况下应将此字段设置为 false
。
这两个 DateTime
字段 和 createdAt
updatedAt
将跟踪文章的创建时间和上次更新时间。每当修改文章时,该 @updatedAt
属性都会使用当前时间戳自动更新字段。每当修改文章时,都会使用当前时间戳为字段添加日期。
创建 Prisma 服务
在 NestJS 应用程序中,最好从应用程序中抽象出 Prisma 客户端 API。为此,您将创建一个包含 Prisma 客户端的新服务。此服务称为 PrismaService
,将负责实例化 PrismaClient
实例并连接到数据库。
Nest CLI 为您提供了一种直接从 CLI 生成模块和服务的方法。在终端中运行以下命令:
npx nest generate module prisma
npx nest generate service prisma
这应该会生成一个带有 and prisma.module.ts
prisma.service.ts
文件的新子目录 ./src/prisma
。服务文件应包含以下代码:
// src/prisma/prisma.service.ts
import { INestApplication, Injectable } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
@Injectable()
export class PrismaService extends PrismaClient {}
Prisma 模块将负责创建 的 PrismaService
单例实例,并允许在整个应用程序中共享服务。为此,您需要将 添加到 PrismaService
文件中的 exports
prisma.module.ts
数组中:
// src/prisma/prisma.module.ts
import { Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';
@Module({
providers: [PrismaService],
exports: [PrismaService],
})
export class PrismaModule {}
现在,任何导入的 PrismaModule
模块都可以访问 PrismaService
并可以将其注入到自己的组件/服务中。这是 NestJS 应用程序的常见模式。
有了这个,你就完成了Prisma的设置!您现在可以开始构建 REST API。
设置 Swagger
Swagger 是一种使用 OpenAPI 规范记录 API 的工具。Nest有一个专用的Swagger模块,你很快就会使用它。
首先安装所需的依赖项:
npm install --save @nestjs/swagger swagger-ui-express
现在打开 main.ts
并使用 SwaggerModule
类初始化 Swagger:
// src/main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const config = new DocumentBuilder()
.setTitle('Median')
.setDescription('The Median API description')
.setVersion('0.1')
.build();
const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup('api', app, document);
await app.listen(3000);
}
bootstrap();
在应用程序运行时,打开浏览器并导航到 http://localhost:3000/api
。您应该会看到 Swagger UI。
总结
祝贺!你已经使用 NestJS 构建了一个基本的 REST API。在本教程中,您将:
- 使用 NestJS 构建了一个 REST API
- 将Prisma顺利集成到NestJS项目中
- 使用 Swagger 和 OpenAPI 记录了您的 REST API
- 本教程的主要内容之一是使用 NestJS 和 Prisma 构建 REST API 是多么容易。这是一个非常高效的堆栈,用于快速构建结构良好、类型安全且可维护的后端应用程序。