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都会被创建出来

相关推荐
superlls3 分钟前
(场景题)Java 导出 Excel 的两种方式
java·开发语言·后端·excel
绝无仅有8 分钟前
某银行大厂面试技术问题深度解析(一)
后端·面试·github
程序新视界12 分钟前
一张图解析MySQL中InnoDB的逻辑存储结构
数据库·后端·mysql
Victor35612 分钟前
Redis(88)Redis缓存的大小如何合理配置?
后端
Victor35613 分钟前
Redis(89)Redis的安全机制有哪些?
后端
绝无仅有14 分钟前
面试自述:从单体到微服务的实践之路
后端·面试·github
XXX-X-XXJ1 小时前
Django 用户认证流程详解:从原理到实现
数据库·后端·python·django·sqlite
胡桃姓胡,蝴蝶也姓胡6 小时前
Rag优化 - 如何提升首字响应速度
后端·大模型·rag
紫荆鱼9 小时前
设计模式-命令模式(Command)
c++·后端·设计模式·命令模式
编码追梦人10 小时前
深耕 Rust:核心技术解析、生态实践与高性能开发指南
开发语言·后端·rust