首页  >  文章  >  web前端  >  使用 Prisma、Express、TypeScript 和 PostgreSQL 构建 RESTful API

使用 Prisma、Express、TypeScript 和 PostgreSQL 构建 RESTful API

WBOY
WBOY原创
2024-09-07 06:31:32851浏览

Building a RESTful API with Prisma, Express, TypeScript, and PostgreSQL

目录

  1. 简介

    • Prisma、Express、TypeScript 和 PostgreSQL 概述
    • 为什么 Prisma 作为 ORM?
    • 设置环境
  2. 初始项目设置

    • 设置新的 Node.js 项目
    • 配置 TypeScript
    • 安装所需的软件包
  3. 设置 PostgreSQL

    • 安装 PostgreSQL
    • 创建新数据库
    • 配置环境变量
  4. 设置 Prisma

    • 安装 Prisma
    • 在项目中初始化 Prisma
    • 配置 Prisma 架构
  5. 定义数据模型

    • 了解 Prisma 架构语言 (PSL)
    • 为 API 创建模型
    • 使用 Prisma 进行迁移
  6. 将 Prisma 与 Express 集成

    • 设置 Express 服务器
    • 使用 Prisma 创建 CRUD 操作
    • 错误处理和验证
  7. 使用 TypeScript 实现类型安全

    • 使用 Prisma 定义类型
    • 类型安全的查询和突变
    • 在 API 开发中利用 TypeScript
  8. 测试 API

    • 为 Prisma 模型编写单元测试
    • 使用 Supertest 和 Jest 进行集成测试
    • 使用 Prisma 模拟数据库
  9. 部署注意事项

    • 为生产准备 API
    • 部署 PostgreSQL
    • 部署 Node.js 应用程序
  10. 结论

    • 将 Prisma 与 Express 和 TypeScript 结合使用的好处
    • 最终想法和后续步骤

一、简介

Prisma、Express、TypeScript 和 PostgreSQL 概述

在现代 Web 开发中,构建健壮、可扩展且类型安全的 API 至关重要。结合 Prisma 作为 ORM、Express 用于服务器端逻辑、TypeScript 用于静态类型以及 PostgreSQL 作为可靠的数据库解决方案的强大功能,我们可以创建强大的 RESTful API。

Prisma 通过提供支持类型安全查询、迁移和无缝数据库模式管理的现代 ORM 来简化数据库管理。 Express 是一个最小且灵活的 Node.js Web 应用程序框架,为 Web 和移动应用程序提供了一组强大的功能。 TypeScript 向 JavaScript 添加了静态类型定义,有助于在开发过程的早期捕获错误。 PostgreSQL 是一个功能强大的开源关系数据库系统,以其可靠性和功能集而闻名。

为什么 Prisma 作为 ORM?

Prisma 与 Sequelize 和 TypeORM 等传统 ORM 相比具有多种优势:

  • 类型安全的数据库查询:自动生成的类型确保您的数据库查询是类型安全且无错误的。
  • 自动迁移: Prisma 提供强大的迁移系统,使您的数据库架构与 Prisma 架构保持同步。
  • 直观的数据建模: Prisma 架构文件(用 PSL 编写)易于理解和维护。
  • 广泛的生态系统: Prisma 与其他工具和服务无缝集成,包括 GraphQL、REST API 和 PostgreSQL 等流行数据库。

设置环境

在我们深入研究代码之前,请确保您的计算机上安装了以下工具:

  • Node.js(推荐LTS版本)
  • npm 或 Yarn(用于包管理)
  • TypeScript(用于静态类型)
  • PostgreSQL(作为我们的数据库)

安装这些工具后,我们就可以开始构建我们的 API。


2. 初始项目设置

设置新的 Node.js 项目

  1. 创建一个新的项目目录:
   mkdir prisma-express-api
   cd prisma-express-api
  1. 初始化一个新的 Node.js 项目:
   npm init -y

这将在您的项目目录中创建一个 package.json 文件。

配置 TypeScript

  1. 安装 TypeScript 和 Node.js 类型:
   npm install typescript @types/node --save-dev
  1. 在项目中初始化 TypeScript:
   npx tsc --init

此命令创建一个 tsconfig.json 文件,它是 TypeScript 的配置文件。根据您的项目需要对其进行修改。这是基本设置:

   {
     "compilerOptions": {
       "target": "ES2020",
       "module": "commonjs",
       "strict": true,
       "esModuleInterop": true,
       "skipLibCheck": true,
       "forceConsistentCasingInFileNames": true,
       "outDir": "./dist"
     },
     "include": ["src/**/*"]
   }
  1. 创建项目结构:
   mkdir src
   touch src/index.ts

安装所需的包

要开始使用 Express 和 Prisma,您需要安装一些必要的软件包:

npm install express prisma @prisma/client
npm install --save-dev ts-node nodemon @types/express
  • express: The web framework for Node.js.
  • prisma: The Prisma CLI for database management.
  • @prisma/client: The Prisma client for querying the database.
  • ts-node: Runs TypeScript directly without the need for precompilation.
  • nodemon: Automatically restarts the server on file changes.
  • @types/express: TypeScript definitions for Express.

3. Setting Up PostgreSQL

Installing PostgreSQL

PostgreSQL can be installed via your operating system’s package manager or directly from the official website. For example, on macOS, you can use Homebrew:

brew install postgresql
brew services start postgresql

Creating a New Database

Once PostgreSQL is installed and running, you can create a new database for your project:

psql postgres
CREATE DATABASE prisma_express;

Replace prisma_express with your preferred database name.

Configuring Environment Variables

To connect to the PostgreSQL database, create a .env file in your project’s root directory and add the following environment variables:

DATABASE_URL="postgresql://<user>:<password>@localhost:5432/prisma_express"

Replace and with your PostgreSQL username and password. This connection string will be used by Prisma to connect to your PostgreSQL database.


4. Setting Up Prisma

Installing Prisma

Prisma is already installed in the previous step, so the next step is to initialize it within the project:

npx prisma init

This command will create a prisma directory containing a schema.prisma file and a .env file. The .env file should already contain the DATABASE_URL you specified earlier.

Configuring the Prisma Schema

The schema.prisma file is where you'll define your data models, which will be used to generate database tables.

Here’s a basic example schema:

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id        Int      @id @default(autoincrement())
  name      String
  email     String   @unique
  createdAt DateTime @default(now())
  posts     Post[]
}

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String?
  published Boolean  @default(false)
  authorId  Int
  author    User     @relation(fields: [authorId], references: [id])
}

In this schema, we have two models: User and Post. Each model corresponds to a database table. Prisma uses these models to generate type-safe queries for our database.


5. Defining the Data Model

Understanding Prisma Schema Language (PSL)

Prisma Schema Language (PSL) is used to define your database schema. It's intuitive and easy to read, with a focus on simplicity. Each model in the schema represents a table in your database, and each field corresponds to a column.

Creating Models for the API

In the schema defined earlier, we created two models:

  • User: Represents users in our application.
  • Post: Represents posts created by users.

Migrations with Prisma

To apply your schema changes to the database, you’ll need to run a migration:

npx prisma migrate dev --name init

This command will create a new migration file and apply it to your database, creating the necessary tables.


6. Integrating Prisma with Express

Setting Up the Express Server

In your src/index.ts, set up the basic Express server:

import express, { Request, Response } from 'express';
import { PrismaClient } from '@prisma/client';

const app = express();
const prisma = new PrismaClient();

app.use(express.json());

app.get('/', (req: Request, res: Response) => {
  res.send('Hello, Prisma with Express!');
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

This code sets up a simple Express server and initializes the Prisma client.

Creating CRUD Operations with Prisma

Next, let’s create some CRUD (Create, Read, Update, Delete) routes for our User model.

Create a new user:

app.post('/user', async (req: Request, res: Response) => {
  const { name, email } = req.body;
  const user = await prisma.user.create({
    data: { name, email },
  });
  res.json(user);
});

Read all users:


app.get('/users', async (req: Request, res: Response) => {
  const users = await prisma.user.findMany();
  res.json(users);
});

Update a user:

app.put('/user/:id', async (req: Request, res: Response) => {
  const { id } = req.params;
  const { name, email } = req.body;
  const user = await prisma.user.update({
    where: { id: Number(id) },
    data: { name, email },
  });
  res.json(user);
});

Delete a user:

app.delete('/user/:id', async (req: Request, res: Response) => {
  const { id } = req.params;
  const user = await prisma.user.delete({
    where: { id: Number(id) },
  });
  res.json(user);
});

Error Handling and Validation

To enhance the robustness of your API, consider adding error handling and validation:

app.post('/user', async (req: Request, res: Response) => {
  try {
    const { name, email } = req.body;
    if (!name || !email) {
      return res.status(400).json({ error: 'Name and email are required' });
    }
    const user = await prisma.user.create({
      data: { name, email },
    });
    res.json(user);
  } catch (error) {
    res.status(500).json({ error: 'Internal Server Error' });
  }
});

7. Using TypeScript for Type Safety

Defining Types with Prisma

Prisma automatically generates TypeScript types for your models based on your schema. This ensures that your database queries are type-safe.

For example, when creating a new user, TypeScript will enforce the shape of the data being passed:

const user = await prisma.user.create({
  data: { name, email }, // TypeScript ensures 'name' and 'email' are strings.
});

Type-Safe Queries and Mutations

With TypeScript, you get autocomplete and type-checking for all Prisma queries, reducing the chance of runtime errors:

const users: User[] = await prisma.user.findMany();

Leveraging TypeScript in API Development

Using TypeScript throughout your API development helps catch potential bugs early, improves code readability, and enhances overall development experience.


8. Testing the API

Writing Unit Tests for Prisma Models

Testing is an essential part of any application development. You can write unit tests for your Prisma models using a testing framework like Jest:

npm install jest ts-jest @types/jest --save-dev

Create a jest.config.js file:

module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
};

Example test for creating a user:

import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

test('should create a new user', async () => {
  const user = await prisma.user.create({
    data: {
      name: 'John Doe',
      email: 'john.doe@example.com',
    },
  });
  expect(user).toHaveProperty('id');
  expect(user.name).toBe('John Doe');
});

Integration Testing with Supertest and Jest

You can also write integration tests using Supertest:

npm install supertest --save-dev

Example integration test:

import request from 'supertest';
import app from './app'; // Your Express app

test('GET /users should return a list of users', async () => {
  const response = await request(app).get('/users');
  expect(response.status).toBe(200);
  expect(response.body).toBeInstanceOf(Array);
});

Mocking the Database with Prisma

For testing purposes, you might want to mock the Prisma client. You can do this using tools like jest.mock() or by creating a mock instance of the Prisma client.


9. Deployment Considerations

Preparing the API for Production

Before deploying your API, ensure you:

  • Remove all development dependencies.
  • Set up environment variables correctly.
  • Optimize the build process using tools like tsc and webpack.

Deploying PostgreSQL

You can deploy PostgreSQL using cloud services like AWS RDS, Heroku, or DigitalOcean. Make sure to secure your database with proper authentication and network settings.

Deploying the Node.js Application

For deploying the Node.js application, consider using services like:

  • Heroku: For simple, straightforward deployments.
  • AWS Elastic Beanstalk: For more control over the infrastructure.
  • Docker: To containerize the application and deploy it on any cloud platform.

10. Conclusion

Benefits of Using Prisma with Express and TypeScript

Using Prisma as an ORM with Express and TypeScript provides a powerful combination for building scalable, type-safe, and efficient RESTful APIs. With Prisma, you get automated migrations, type-safe queries, and an intuitive schema language, making database management straightforward and reliable.

Congratulations!! You've now built a robust RESTful API using Prisma, Express, TypeScript, and PostgreSQL. From setting up the environment to deploying the application, this guide covered the essential steps to get you started. As next steps, consider exploring advanced Prisma features like nested queries, transactions, and more complex data models.

Happy coding!

以上是使用 Prisma、Express、TypeScript 和 PostgreSQL 构建 RESTful API的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn