使用 NestJS 和 Prisma 构建 REST API

news2024/11/27 14:33:36

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 是多么容易。这是一个非常高效的堆栈,用于快速构建结构良好、类型安全且可维护的后端应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/952497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

链路聚合原理

文章目录 一、定义二、功能三、负载分担四、分类五、常用命令 首先可以看下思维导图,以便更好的理解接下来的内容。 一、定义 在网络中,端口聚合是一种将连接到同一台交换机的多个物理端口捆绑在一起,形成一个逻辑端口的技术。通过端口聚合&…

数据结构--5.0.1图的存储结构

目录 一、邻接矩阵(无向图) 二、邻接矩阵(有向图) 三、邻接矩阵(网) 四、邻接表(无向图) 五、邻接表(有向图) ——图的存储结构相比较线性表与树来说就复…

AIGC全流程赋能:从剧本到宣发,影视内容全新呈现

“猕猴桃”视频平台在今日发布了2023年第二季度财报,首次公布引入AIGC辅助剧本评估。内部数据显示,AIGC帮助提升剧本评估、预算规划等效率超过90%。“猕猴桃”视频平台还通过AIGC技术实现对影视剧的剧情理解,从而改进搜索结果、推荐和用户互动…

kubernetes deploy standalone mysql demo

kubernetes 集群内部署 单节点 mysql ansible all -m shell -a "mkdir -p /mnt/mysql/data"cat mysql-pv-pvc.yaml apiVersion: v1 kind: PersistentVolume metadata:name: mysql-pv-volumelabels:type: local spec:storageClassName: manualcapacity:storage: 5Gi…

IAR 编译优化 #pragma optimize

在IAR工具菜单栏中 点击 【help】-> 【Serach】 搜索optimize #pragma optimize[goal][level][vectorize][disable] 如果想设置优化速度到最高等级,则如下设置即可 #pragma optimizespeed high int SmallAndUsedOften() { /* Do something here. */ }

分布式事务学习笔记

MySQL事务 1、 MySQL事务隔离级别 读未提交 (READ UNCOMMITTED) (存在脏读的问题)读已提交(READ COMMITTED)可重复读(REPEATABLE READ)串行化(SERIALIZABLE)…

LCD驱动

一、Linux 下 LCD 驱动简析 1.与裸机的异同 在 Linux 中应用程序最终也是通过操作 RGB LCD 的显存来实现在 LCD 上显示字符、图片等信息,但是Linux系统的内存管理严格,使用显存需要申请,因为虚拟内存的存在,驱动程序设置的显存和应…

python 栈、用栈实现综合计算器

栈的基本介绍 出栈(pop)示意图 入栈(push)示意图 栈的应用场景 数组模拟栈 思路分析 代码实现 # 用数组模拟栈 class ArrayStack:def __init__(self, size):self.max_size size # 栈的最大容量self.top -1 # top 表示栈顶…

Python项目实战之《飞机大战游戏》

目录 一、Pygame库包简介 二、Pygame安装 三、项目开发思路 3.1前言 3.2飞机大战开发步骤 一、Pygame库包简介 Pygame是一个基于python的游戏开发库,它提供一系列的工具和接口,使开发人员能够轻松的创建各种类型的游戏,包括2D游戏和简单…

ptmalloc源码分析 - _int_malloc函数实现fastbins(06)

目录 一、_int_malloc内存分配的核心函数 二、bins的管理和chunk的结构 三、_int_malloc函数分配前的两个检查 四、REMOVE_FB原子实现fastbins的链表操作 五、fastbins的具体分配实现 一、_int_malloc内存分配的核心函数 前几章节,我们主要讲解了状态机malloc_…

xml

1.xml 1.1概述【理解】 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年,又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者: Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域最具权威和影响力的国际中立性技术标准机构。 到目前为…

nginx反向代理 负载均衡

一、反向代理: 1.反向代理介绍: 反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。 Nginx 除了可以在企业提供高性能的web…

从2023蓝帽杯0解题heapSpary入门堆喷

从2023蓝帽杯0解题heapSpary入门堆喷 关于堆喷 堆喷射(Heap Spraying)是一种计算机安全攻击技术,它旨在在进程的堆中创建多个包含恶意负载的内存块。这种技术允许攻击者避免需要知道负载确切的内存地址,因为通过广泛地“喷射”堆…

三路排序算法(Java 实例代码)

目录 三路排序算法 一、概念及其介绍 二、适用说明 四、Java 实例代码 QuickSort3Ways.java 文件代码: 三路排序算法 一、概念及其介绍 三路快速排序是双路快速排序的进一步改进版本,三路排序算法把排序的数据分为三部分,分别为小于 v&…

blender 火焰粒子

效果展示 创建火焰模型 新建立方体(shift A ),添加表面细分修改器(ctrl 2 ),视图层级调整为 3 ,这样布线更密集; 右键将模型转换为网格,tab 进入编辑模式,7 切换到顶…

基于 Debian 12 的 Devuan GNU+Linux 5 为软件自由爱好者而生

导读Devuan 开发人员宣布发布 Devuan GNULinux 5.0 “代达罗斯 “发行版,它是 Debian GNU/Linux 操作系统的 100% 衍生版本,不包含 systemd 和相关组件。 Devuan GNULinux 5 基于最新的 Debian GNU/Linux 12 “书虫 “操作系统系列,采用长期支…

Kafka3.0.0版本——手动调整分区副本示例

目录 一、服务器信息二、启动zookeeper和kafka集群2.1、先启动zookeeper集群2.2、再启动kafka集群 三、手动调整分区副本3.1、手动调整分区副本的前提条件3.2、手动调整分区副本的示例需求3.3、手动调整分区副本的示例 一、服务器信息 四台服务器 原始服务器名称原始服务器ip节…

新型安卓恶意软件使用Protobuf协议窃取用户数据

近日有研究人员发现,MMRat新型安卓银行恶意软件利用protobuf 数据序列化这种罕见的通信方法入侵设备窃取数据。 趋势科技最早是在2023年6月底首次发现了MMRat,它主要针对东南亚用户,在VirusTotal等反病毒扫描服务中一直未被发现。 虽然研究…

Linux--VMware的安装和Centos

一、VMware和Linux的关系 二、VMware的安装 VM_ware桌面虚拟机 最新中文版 软件下载 (weizhen66.cn) VMware-Workstation-Lite-16.2.2-19200509-精简安装注册版.7z - 蓝奏云 如果安装不成功,则设置BIOS 三、在VMware中加入Centos 下载地址: CentOS-…

深度学习论文分享(八)Learning Event-Driven Video Deblurring and Interpolation

深度学习论文分享(八)Learning Event-Driven Video Deblurring and Interpolation 前言Abstract1 Introduction2 Motivation2.1 Physical Model of Event-based Video Reconstruction2.2 Spatially Variant Triggering Threshold 3 Proposed Methods3.1 …