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

相关推荐
paopaokaka_luck1 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
码农小旋风3 小时前
详解K8S--声明式API
后端
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml43 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~3 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616883 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
睡觉谁叫~~~4 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
2401_865854887 小时前
iOS应用想要下载到手机上只能苹果签名吗?
后端·ios·iphone
AskHarries7 小时前
Spring Boot集成Access DB实现数据导入和解析
java·spring boot·后端
2401_857622667 小时前
SpringBoot健身房管理:敏捷与自动化
spring boot·后端·自动化