使用Prisma与NestJS构建REST API实战指南

使用Prisma与NestJS构建REST API实战指南

prisma-examples 🚀 Ready-to-run Prisma example projects prisma-examples 项目地址: https://gitcode.com/gh_mirrors/pr/prisma-examples

前言

在现代Web开发中,ORM(对象关系映射)工具和框架的结合使用可以显著提高开发效率。本文将详细介绍如何使用Prisma ORM与NestJS框架构建一个功能完善的REST API。这个示例项目展示了如何实现用户和文章的CRUD操作,并提供了数据库迁移和种子数据的完整工作流。

项目概述

该项目构建了一个博客平台的基础API,主要功能包括:

  • 用户管理(创建、查询)
  • 文章管理(创建、查询、更新、删除)
  • 文章发布状态管理
  • 文章浏览计数

技术栈

  • NestJS:一个用于构建高效、可扩展Node.js服务器端应用程序的框架
  • Prisma:下一代Node.js和TypeScript的ORM工具
  • SQLite:轻量级数据库(可切换为其他数据库)

环境准备

1. 初始化项目

首先需要获取项目模板并进入项目目录:

npx try-prisma@latest --template orm/nest
cd nest

2. 数据库配置

项目默认使用SQLite数据库,位于prisma/dev.db。如需切换为PostgreSQL或其他数据库,可修改prisma/schema.prisma文件中的datasource配置。

数据库初始化

1. 创建数据库结构

运行以下命令创建数据库表结构并应用初始迁移:

npx prisma migrate dev --name init

此命令会:

  1. 根据schema定义创建数据库表
  2. 运行种子脚本填充初始数据

2. 种子数据

种子脚本位于prisma/seed.ts,默认会创建一些用户和文章的示例数据。如需手动运行种子:

npx prisma db seed

启动开发服务器

npm run dev

服务器启动后,默认监听3000端口,可以通过http://localhost:3000访问API。

API接口详解

文章相关接口

获取文章列表
  • GET /feed
    • 参数:
      • searchString:搜索标题或内容
      • take:返回数量
      • skip:跳过数量
      • orderBy:排序方式(asc/desc)
获取单篇文章
  • GET /post/:id
创建文章
  • POST /post
    • 请求体:
      • title:文章标题(必填)
      • content:文章内容
      • authorEmail:作者邮箱(必填)
更新文章
  • PUT /publish/:id:切换发布状态
  • PUT /post/:id/views:增加浏览次数
删除文章
  • DELETE /post/:id

用户相关接口

获取用户列表
  • GET /users
获取用户草稿
  • GET /user/:id/drafts
创建用户
  • POST /signup
    • 请求体:
      • email:用户邮箱(必填)
      • name:用户名称
      • postData:关联文章数据

项目演进示例

随着业务发展,我们可能需要为系统添加新功能。下面以添加用户资料(Profile)功能为例,展示项目演进过程。

1. 数据库迁移

首先修改Prisma schema文件,添加Profile模型:

model Profile {
  id     Int     @id @default(autoincrement())
  bio    String?
  user   User    @relation(fields: [userId], references: [id])
  userId Int     @unique
}

然后生成并应用迁移:

npx prisma migrate dev --name add-profile

2. 实现API端点

在控制器中添加新的端点处理用户资料:

@Post('user/:id/profile')
async createUserProfile(
  @Param('id') id: string,
  @Body() userBio: { bio: string }
): Promise<Profile> {
  return this.prismaService.profile.create({
    data: {
      bio: userBio.bio,
      user: { connect: { id: Number(id) } }
    }
  })
}

3. 测试新功能

重启服务器后,可以通过POST请求/user/:id/profile创建用户资料。

数据库切换指南

Prisma支持多种数据库,只需修改schema文件中的datasource配置即可切换:

PostgreSQL配置示例

datasource db {
  provider = "postgresql"
  url      = "postgresql://user:password@localhost:5432/dbname"
}

MySQL配置示例

datasource db {
  provider = "mysql"
  url      = "mysql://user:password@localhost:3306/dbname"
}

最佳实践建议

  1. 环境变量管理:生产环境建议使用.env文件管理数据库连接字符串
  2. 错误处理:为API添加适当的错误处理中间件
  3. 输入验证:使用class-validator等库验证请求数据
  4. 分页优化:为列表接口实现高效的分页查询
  5. 性能监控:添加日志和性能监控中间件

总结

通过这个项目,我们学习了如何使用Prisma和NestJS构建一个完整的REST API。Prisma提供了强大的类型安全和直观的数据建模能力,而NestJS则带来了清晰的项目结构和丰富的生态系统支持。这种组合特别适合需要快速开发且要求类型安全的中大型项目。

希望本指南能帮助你快速上手Prisma与NestJS的开发。随着对这两个工具的深入理解,你可以构建出更复杂、更强大的后端服务。

prisma-examples 🚀 Ready-to-run Prisma example projects prisma-examples 项目地址: https://gitcode.com/gh_mirrors/pr/prisma-examples

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

资源下载链接为: https://pan.quark.cn/s/5c50e6120579 在Android移动应用开发中,定位功能扮演着极为关键的角色,尤其是在提供导航、本地搜索等服务时,它能够帮助应用获取用户的位置信息。以“baiduGPS.rar”为例,这是一个基于百度地图API实现定位功能的示例项目,旨在展示如何在Android应用中集成百度地图的GPS定位服务。以下是对该技术的详细阐述。 百度地图API简介 百度地图API是由百度提供的一系列开放接口,开发者可以利用这些接口将百度地图的功能集成到自己的应用中,涵盖地图展示、定位、路径规划等多个方面。借助它,开发者能够开发出满足不同业务需求的定制化地图应用。 Android定位方式 Android系统支持多种定位方式,包括GPS(全球定位系统)和网络定位(通过Wi-Fi及移动网络)。开发者可以根据应用的具体需求选择合适的定位方法。在本示例中,主要采用GPS实现高精度定位。 权限声明 在Android应用中使用定位功能前,必须在Manifest.xml文件中声明相关权限。例如,添加<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />,以获取用户的精确位置信息。 百度地图SDK初始化 集成百度地图API时,需要在应用启动时初始化地图SDK。通常在Application类或Activity的onCreate()方法中调用BMapManager.init(),并设置回调监听器以处理初始化结果。 MapView的创建 在布局文件中添加MapView组件,它是地图显示的基础。通过设置其属性(如mapType、zoomLevel等),可以控制地图的显示效果。 定位服务的管理 使用百度地图API的LocationClient类来管理定位服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓秋薇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值