发布到阿里云

52 阅读2分钟

nestjs

node环境

Alibaba Cloud Linux 上安装 Node.js 
推荐方式是使用 NVMNode 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 修改为 1MySQL 会尝试将所有表名转换为小写。
如果现有表名在存储时区分大小写(例如 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