nest使用priams连接docker

240 阅读4分钟

1. 创建 NestJS 项目

如果你还没有创建一个 NestJS 项目,先用以下命令创建:

bash
复制代码
nest new nest-prisma-docker

然后进入到你的项目目录:

bash
复制代码
cd nest-prisma-docker

2. 安装 Prisma 和相关依赖

在你的 NestJS 项目中,安装 Prisma 以及 Prisma CLI 和 PostgreSQL 适配器:

bash
复制代码
npm install @prisma/client
npm install prisma --save-dev

3. 配置 Docker 数据库

我们将使用 Docker 启动 PostgreSQL 数据库。首先,确保你已经安装了 Docker,并且 Docker 守护进程正在运行。

在项目根目录下创建一个 docker-compose.yml 文件,配置 PostgreSQL 服务:

yaml
复制代码
version: '3.8'

services:
  db:
    image: postgres:13
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password123
      POSTGRES_DB: nest
    ports:
      - "5432:5432"
    networks:
      - nest-network

networks:
  nest-network:
    driver: bridge

然后启动数据库容器:

bash
复制代码
docker-compose up -d

这样就启动了一个 PostgreSQL 数据库,你可以通过 localhost:5432 访问它,用户名是 postgres,密码是 password123,数据库名是 nest

4. 初始化 Prisma

接下来,初始化 Prisma 配置文件。在项目根目录运行以下命令:

bash
复制代码
npx prisma init

这会在项目中创建一个 prisma 文件夹,并在其中生成一个 schema.prisma 文件。你可以在 schema.prisma 文件中配置数据库连接。

5. 配置 Prisma 数据源

编辑 prisma/schema.prisma 文件,配置连接到 Docker PostgreSQL 数据库:

prisma
复制代码
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")  // 从环境变量获取数据库连接字符串
}

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

6. 配置 .env 文件

在根目录下创建一个 .env 文件,配置数据库的连接字符串:

bash
复制代码
DATABASE_URL="postgresql://postgres:password123@localhost:5432/nest?schema=public"

确保 DATABASE_URL 中的用户名、密码、数据库名、主机和端口与 docker-compose.yml 中的配置相匹配。

7. 创建模型

prisma/schema.prisma 文件中,定义你的数据模型。例如,我们创建一个简单的 User 模型:

prisma
复制代码
model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  password  String
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

8. 生成 Prisma 客户端

在终端运行以下命令生成 Prisma 客户端:

bash
复制代码
npx prisma generate

这将根据 schema.prisma 中的定义生成数据库客户端。

9. 运行数据库迁移

使用 Prisma 迁移功能来同步数据库架构。运行以下命令来生成和应用迁移:

bash
复制代码
npx prisma migrate dev --name init

此命令会根据模型创建一个数据库迁移,并应用它。它还会自动生成相应的 SQL 文件。

10. 在 NestJS 中使用 Prisma

现在,创建一个 Prisma 服务,用于在 NestJS 中与数据库交互。

创建 src/prisma/prisma.service.ts 文件,并添加以下内容:

typescript
复制代码
import { Injectable } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';

@Injectable()
export class PrismaService extends PrismaClient {
  constructor() {
    super();
  }
}

11. 在模块中引入 Prisma 服务

src/app.module.ts 中引入并使用 Prisma 服务:

typescript
复制代码
import { Module } from '@nestjs/common';
import { PrismaService } from './prisma/prisma.service';

@Module({
  imports: [],
  controllers: [],
  providers: [PrismaService],
})
export class AppModule {}

12. 使用 Prisma 服务

现在,你可以在你的服务中使用 Prisma 客户端与数据库进行交互。例如,创建一个 UserService 来操作用户数据。

创建 src/user/user.service.ts 文件,并添加以下内容:

typescript
复制代码
import { Injectable } from '@nestjs/common';
import { PrismaService } from 'src/prisma/prisma.service';

@Injectable()
export class UserService {
  constructor(private prisma: PrismaService) {}

  async createUser(email: string, password: string) {
    return await this.prisma.user.create({
      data: {
        email,
        password,
      },
    });
  }

  async getUsers() {
    return await this.prisma.user.findMany();
  }
}

13. 控制器中使用服务

最后,创建一个控制器来处理用户的 API 请求。创建 src/user/user.controller.ts 文件:

typescript
复制代码
import { Controller, Post, Body, Get } from '@nestjs/common';
import { UserService } from './user.service';

@Controller('users')
export class UserController {
  constructor(private userService: UserService) {}

  @Post()
  createUser(@Body() body: { email: string; password: string }) {
    return this.userService.createUser(body.email, body.password);
  }

  @Get()
  getUsers() {
    return this.userService.getUsers();
  }
}

14. 模块化

确保在 src/user/user.module.ts 中注册服务和控制器:

typescript
复制代码
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
import { PrismaService } from 'src/prisma/prisma.service';

@Module({
  controllers: [UserController],
  providers: [UserService, PrismaService],
})
export class UserModule {}

并将 UserModule 导入到 src/app.module.ts 中:

typescript
复制代码
import { Module } from '@nestjs/common';
import { UserModule } from './user/user.module';

@Module({
  imports: [UserModule],
  controllers: [],
  providers: [],
})
export class AppModule {}

15. 运行项目

现在,确保一切设置正确,可以启动你的 NestJS 应用:

bash
复制代码
npm run start

16. 访问接口

你可以通过 Postman 或其他 HTTP 客户端测试以下 API:

  • POST /users:创建一个新用户

    • 请求体:

      json
      复制代码
      {
        "email": "user@example.com",
        "password": "password123"
      }
      
  • GET /users:获取所有用户列表。