NestJS+Prisma+Docker 开发
先 Prisma,后 Docker
本地配置 Prisma
安装 Prisma CLI
在你的 NestJS 项目根目录执行:
npm install prisma --save-dev
npm install @prisma/client
初始化 Prisma
项目根目录执行命令,自动生成prisma/目录、schema.prisma文件和.env文件:
npx prisma init
配置本地 MySQL 连接
修改项目根目录下的.env文件,配置本地 MySQL 连接地址:
DATABASE_URL="mysql://root:root123456@localhost:3306/nest_app_db?schema=public&charset=utf8mb4"
编写数据模型
修改prisma/schema.prisma文件,定义数据模型:
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
name String @db.VarChar(50)
phone String? @db.VarChar(20)
wardrobe Wardrobe[]
createdAt DateTime @default(now())
}
model Wardrobe {
id Int @id @default(autoincrement())
userId Int
clothes String[]
user User @relation(fields: [userId], references: [id])
createdAt DateTime @default(now())
}
生成 Prisma Client 并同步数据库
执行以下命令生成客户端并同步数据库结构:
npx prisma generate
npx prisma db push
封装 PrismaService
创建src/prisma/prisma.service.ts文件:
import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {
async onModuleInit() {
await this.$connect();
console.log('✅ Prisma 本地数据库连接成功!');
}
async onModuleDestroy() {
await this.$disconnect();
}
}
然后在根模块 AppModule 中注册:
// src/app.module.ts
import { Module } from '@nestjs/common';
import { PrismaService } from './prisma/prisma.service';
import { UserModule } from './user/user.module';
@Module({
imports: [UserModule],
providers: [PrismaService],
exports: [PrismaService], // 导出供其他模块使用
})
export class AppModule {}
Docker 配置
.dockerignore 示例
node_modules
npm-debug.log
.DS_Store
.git
.gitignore
.env
*.md
*.log
dist
.dockerignore 文件用于排除不需要复制到 Docker 镜像中的文件和目录,类似于 .gitignore。这个示例排除了常见的开发文件、日志和依赖目录。
Dockerfile 示例
# 使用官方 Node.js 镜像作为基础
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制项目文件
COPY . .
# 构建应用(如果是前端项目)
RUN npm run build
# 暴露端口
EXPOSE 3000
# 启动命令
CMD ["npm", "start"]
这个 Dockerfile 示例展示了如何为一个 Node.js 应用创建镜像。它使用了轻量级的 Alpine Linux 版本,设置了工作目录,复制并安装依赖,最后指定了启动命令。
docker-compose.yml 示例
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
environment:
- NODE_ENV=development
depends_on:
- db
db:
image: postgres:13
environment:
- POSTGRES_PASSWORD=example
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
这个 docker-compose.yml 示例定义了两个服务:一个 Node.js 应用和一个 PostgreSQL 数据库。应用服务使用当前目录的 Dockerfile 构建,映射了端口和卷,并设置了环境变量。数据库服务使用官方 PostgreSQL 镜像,配置了密码和数据卷。
这三个文件配合使用可以快速搭建一个包含应用和数据库的开发环境。根据具体项目需求,可能需要调整其中的配置参数和命令。
创建 Docker 配置文件
在项目根目录创建以下文件:
.dockerignoreDockerfiledocker-compose.yml
修改 .env 文件
更新.env文件以兼容本地和 Docker 环境:
DATABASE_URL="mysql://nest_dev:nest_dev123@localhost:3306/nest_app_db?schema=public&charset=utf8mb4"
启动 Docker 容器
执行以下命令启动容器:
docker-compose up -d
同步数据库结构
在 Docker 容器内执行同步命令:
docker-compose exec nest-app npx prisma db push
更多推荐
所有评论(0)