nestjs之个人博客项目

初始化nestjs项目

使用pnpm初始化nstjs项目,并生成auth[登录、注册]模块,具体步骤见Nestjs学习笔记 - 掘金 (juejin.cn)

自定义表单验证错误类

创建完dto文件之后,我们需要自定义表单验证错误类

  • src/common/validation/validation.pipe.ts
js 复制代码
// 自定义管道,这样前端入参就会先走管道,然后再出来
import { PipeTransform, Injectable, ArgumentMetadata, HttpStatus, HttpException } from '@nestjs/common'
import { validate } from 'class-validator'
import { plainToInstance } from 'class-transformer'
@Injectable()
export class ValidationPipe implements PipeTransform {
  async transform(value: any, metadata: ArgumentMetadata) {
    //前台提交的表单数据没有类型,使用 plainToClass 转为有类型的对象用于验证
    const object = plainToInstance(metadata.metatype, value)
    //根据 DTO 中的装饰器进行验证
    const errors = await validate(object)

    if (errors.length) {
      const messages = errors.map((error) => {
        return {
          name: error.property,
          message: Object.values(error.constraints),
        }
      })
      console.log(messages)
      throw new HttpException(messages, HttpStatus.BAD_REQUEST) //nestjs中默认错误状态码是400
    }
    return value
  }
}

然后我们在main.ts中使用即可

js 复制代码
import { NestFactory } from '@nestjs/core'
import { AppModule } from './app.module'
import { ValidationPipe } from './common/validation/validation.pipe'
import { HttpExceptionFilter } from './common/validation/http-exception.filter'

async function bootstrap() {
  const app = await NestFactory.create(AppModule)
  app.useGlobalPipes(new ValidationPipe()) //全局管道注入,main.ts没有在模块上,所以依赖注入不能用,因此需要手动new一下
  app.useGlobalFilters(new HttpExceptionFilter()) //全局注册过滤器
  await app.listen(3000)
}
bootstrap()

初始化prisma

这里具体内容看我上篇文章Nestjs学习笔记 - 掘金 (juejin.cn)

prisma/schema.prisma

js 复制代码
generator client {
  provider = "prisma-client-js"
}

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

model user {
  id       Int     @id @default(autoincrement())
  name     String? @unique
  password String
}

model article {
  id      Int    @id @default(autoincrement())
  title   String @unique
  content String @db.Text
}

prisma/seed.ts

js 复制代码
import { PrismaClient } from '@prisma/client'
import * as bcrypt from 'bcryptjs'
import { Random } from 'mockjs'
const prisma = new PrismaClient()
const run = async () => {
  await prisma.user.create({
    data: {
      name: 'admin',
      password: await bcrypt.hashSync('123456'),
    },
  })

  for (let i = 0; i < 50; i++) {
    await prisma.atticle.create({
      data: {
        title: Random.ctitle(1, 30),
        content: Random.cparagraph(30, 50),
      },
    })
  }
}
run()

我们利用 npx prisma migrate dev 来生产迁移文件,会自动执行数据填充;我们也可以执行以下命令重置数据库 npx prisma migrate reset

完成注册登录及jwt鉴权

这里具体内容看我上篇文章Nestjs学习笔记 - 掘金 (juejin.cn)

获取文章列表和分页数据

首先创建一个模块 nest g res article --no-spec,选择REST API方案,之后控制器、服务、dto都会被创建出来

相关推荐
小码哥_常8 小时前
Spring Boot:别再重复造轮子,这些内置功能香麻了
后端
皮皮林5519 小时前
OpenFeign 首次调用卡 3 秒?八年老开发扒透 5 个坑,实战优化到 100ms!
后端
千寻girling10 小时前
《 Git 详细教程 》
前端·后端·面试
0xDevNull11 小时前
Linux 中 Nginx 代理 Redis 的详细教程
redis·后端
GetcharZp11 小时前
告别 Nginx 手动配置!这款 Go 语言开发的云原生网关,才是容器化时代的真香神器!
后端
RuoyiOffice12 小时前
SpringBoot+Vue3 企业考勤如何处理法定假期?节假日方案、调休补班与工作日判断链路拆解
spring boot·后端·vue·anti-design-vue·ruoyioffice·假期·人力
Vane112 小时前
从零开发一个AI插件,经历了什么?
人工智能·后端
9523612 小时前
SpringBoot统一功能处理
java·spring boot·后端
rleS IONS13 小时前
SpringBoot中自定义Starter
java·spring boot·后端
DevilSeagull13 小时前
MySQL(2) 客户端工具和建库
开发语言·数据库·后端·mysql·服务