本文目录

[[toc]]

NestJS 组件

Fastify

NestJS 主要封装的是应用层的功能,底层的网络请求处理框架可以按照 adapter 修改,默认支持 Express 与 Fastify ,推荐更换为 Fastify ,性能更好。

import { FastifyAdapter } from '@nestjs/platform-fastify'

async function bootstrap() {
  const app = await NestFactory.create(
    AppModule,
    // 使用 fastify 作为底层框架
    new FastifyAdapter({
      // fastify 配置
      logger: false,
      ignoreTrailingSlash: true,
    }),
  )

  await app.listen(process.env.PORT ?? 3000)
}

可以通过 app.getHttpAdapter().getInstance() 获取 Fastify 实例,使用 Fastify 特有的功能,比如 fastify.register(helmet, {}) 添加安全策略配置

Swagger

优先安装 Swagger ,本身可以通过 UI 的方式发起请求,省了 curl 与 postman 的时间, NestJS 官方提供了 @nestjs/swagger 实现 Swagger 支持,可以很快上手初始化:

// main.ts
async function bootstrap() {
  // 初始化 NestJS 应用
  const app = await NestFactory.create(AppModule)

  // 初始化 Swagger
  initSwagger(app)

  // 监听端口
  await app.listen(process.env.PORT ?? 3000)
}
bootstrap()

function initSwagger(app: INestApplication) {
  // 判断是否为开发环境
  const isDev = process.env.NODE_ENV === 'development'
  if (!isDev) {
    return
  }

  // 在这里初始化 Swagger 描述信息
  const config = new DocumentBuilder()
    .setTitle('My API')
    .setDescription('My API description')
    .setVersion('1.0')
    .addTag('He110')
    .build()
  const documentFactory = () => SwaggerModule.createDocument(app, config)

  // 设置 swagger 对应的 url 为 /swagger
  SwaggerModule.setup('swagger', app, documentFactory)
}

Prisma

使用

  1. Prisma 是强类型的,可以通过 npx prisma generate ,根据数据描述的 Schema 生成 ORM 的类型。
  2. 通过 npx prisma db push --force-reset 初始化数据库,同时也会测试连接状态。

环境变量

Prisma 不支持根据运行环境自动切换 .env 文件,所以像 vite 那种按照优先级启用 dotenv 的功能需要自行实现

MongoDB

连接不上数据库

连接 MongoDB 报错 Error in connector: SCRAM failure: Authentication failed.

参考 官方文档 ,在高版本的 MongoDB 中需要添加 ?authSource=admin 查询参数才能连接

无法新增数据

Prisma 连接 MongoDB 只允许在 复制集开启事务 ,如果是本地部署一般没有开复制集,所以需要先 开一个复制集 ,或者连接 在线的 MongoDB Atlas

参数校验

请求参数校验 NestJS 官方推荐使用 Pipe 去处理,如果使用 zod 的话,需要搭配 nestjs-zod

如果按照官方的 zod 引入教程 的话,会导致 Swagger 展示出问题,读不到内容。

nestjs-zod 提供了 patchNestJsSwagger ,可以将 zod 定义的 Schema 注入到 Swagger 里面,避免重复定义数据结构问题。