使用 NestJS 和 Prisma 构建 REST API

NestJS是Node.js框架之一,它最近获得了很多开发人员的喜爱和牵引力。本文将教你如何使用NestJS,Prisma,PostgreSQL和Swagger构建后端REST API。

在这里插入图片描述

介绍

在本教程中,您将学习如何为名为“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 是多么容易。这是一个非常高效的堆栈,用于快速构建结构良好、类型安全且可维护的后端应用程序。

猜你喜欢

转载自blog.csdn.net/jslygwx/article/details/132580600