nestjs
node环境
在 Alibaba Cloud Linux 上安装 Node.js
推荐方式是使用 NVM(Node Version Manager)
表名大小写
[!tip]
prisma生成的表名首字母大写
windows默认都是小写
原因
Linux/Unix系统:
默认区分大小写(例如 User 和 user 被视为不同的表)
原因:文件系统本身区分大小写,表名直接映射到文件系统中的文件名
Windows系统:
默认不区分大小写(例如 User 和 user 指向同一张表)
原因:NTFS文件系统不区分大小写
Mac OS:
默认不区分大小写(HFS+文件系统),但若使用UFS格式则区分
统一小写
在schema.prisma里使用map映射
@@map("user")
多对多关系
// 显式定义关联表模型
model UserRole {
userId Int
roleId Int
user User @relation(fields: [userId], references: [id])
role Role @relation(fields: [roleId], references: [id])
// 复合主键(可选)
@@id([userId, roleId])
// 关键:强制关联表名为小写
@@map("user_role")
}
// 更新查找和update逻辑
const findUser = await this.prismaService.user.findUnique({
where: { username: loginDto.username },
include: {
roles: {
include: {
role: {
include: {
permissions: {
include: {
permission: true
}
}
}
}
}
}
}
})
return this.prismaService.role.update({
where: { id: ud.id },
data: {
name: ud.newName,
permissions: {
deleteMany: {},
create: ud.permissions.map((pid: any) => ({
permissionId: pid.id
}))
}
}
})
失败的处理
修改mysql配置项
在已有数据库的情况下将 lower_case_table_names 从 0 修改为 1 时
MySQL 会尝试将所有表名转换为小写。
如果现有表名在存储时区分大小写(例如 MyTable 和 mytable 是两个不同的表),
那么修改配置后可能会导致表名冲突,从而引发启动失败
打包导入
打包
npm run build
文件目录
-dist
-node_modules
-public
-package.json
-pachage-lock.json
安装依赖
文件导入服务器后需安装依赖项
生成node_modules文件夹
prisma初始化
npx prisma init
// 生成prisma文件夹和.env文件
-dist
-prisma
--schema.prisma
-.env
-node_modules
-public
-package.json
-pachage-lock.json
prisma
将nestjs工程的schema.prisma
导入并覆盖
修改.env数据库和其他配置
# 检查 Schema 语法
npx prisma validate
# 观察输出是否包含 "✔ Generated Prisma Client"
npx prisma generate
重置
npx prisma migrate reset
迁移
npx prisma migrate dev
表生成后的迁移
npx prisma migrate deploy
运行项目
pm2
npm install -g pm2
pm2 -v
// 启动项目
pm2 start dist/main.js
// 以生产方式启动
pm2 start npm --name "nestjs" -- run start:prod
// 所有运行的项目
pm2 list
// 项目日志
pm2 logs main(项目名)
// 停止进程
pm2 stop main
// 删除进程
pm2 delete 0
// 删除所有
pm2 delete all
// 重启
pm2 restart main(项目名)
// 重启并更新env
pm2 restart main(项目名) --update-env