前言
在 Node.js 生态里,如果你厌倦了 Express 的无结构混乱,又觉得 Koa 太轻量缺乏规范,那么 NestJS 或许正是你想要的答案。让你写 Node.js 像写 Java 的 SpringBoot 一样优雅。
正文
核心特性
依赖注入(DI)容器:Nest 提供了强大的 DI 系统,让服务的创建与注入变得自然流畅
模块化设计:每个功能单元都可以封装成模块,清晰分层,便于团队协作和代码复用
强大的生态系统:Nest 提供 CLI 工具、GraphQL 支持、WebSocket、Microservices 模块等,满足各种场景
架构设计
NestJS 默认采用 MVC 架构,这一设计让 Nest 非常适合做企业级的微服务架构,也适合渐进式改造原有系统!
上手体验
快速创建一个 Nest 项目只需两步:
npx --yes @nestjs/cli new services/api --package-manager pnpm
pnpm add prisma @prisma/client
如果你像我一样使用 prisma ,配置完 model 后还需要下面两步:
generator client {
  provider = "prisma-client-js"
}
datasource db {
  provider = "sqlite"
  url      = "file:./dev.db"
}
model User {
  id         Int      @id @default(autoincrement())
  username   String   @unique
  password   String
  is_admin   Boolean  @default(false)
}
npx prisma init
npx prisma generate
接着建议小伙伴,可以先定义一些全局的类,比如:Resposed、Table、 LoadMore,
基于 User 模块的增删改查(CRUD)
用户模块是后端系统中最常见的业务模块之一,现在只需要关注 Controller 层处理路由,Service 层处理业务逻辑,Entity 的工作 Prisma 已经帮我们完成了!
// src/controllers/user.ts
@Controller()
export class UserController {
  constructor(private readonly userService: UserService) {}
  @Get('/user/list')
  async getUserList(): Promise<ISuccessResponse<User[]> | IErrorResponse> {
    try {
      const useList = await this.userService.getUserList();
      return {
        code: 200,
        message: 'success',
        data: useList,
      };
    } catch (error) {
      return {
        code: 500,
        message: error,
      };
    }
  }
}
// src/services/user.ts
import { Injectable } from '@nestjs/common';
import { User } from '@prisma/client';
import { PrismaClient } from '@prisma/client';
@Injectable()
export class UserService {
  private prisma: PrismaClient;
  constructor() {
    this.prisma = new PrismaClient();
  }
 
  async getUserList(): Promise<User[]> {
    return await this.prisma.user.findMany();
  }
}
// src/app.module.ts
import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR, APP_GUARD } from '@nestjs/core';
import { ConfigModule } from '@nestjs/config';
import { UserController } from './controllers/user';
import { UserService } from './services/user';
@Module({
  imports: [
    ConfigModule.forRoot(), // 自动读取 .env 文件
  ],
  controllers: [
    UserController,
  ],
  providers: [
    UserService,
  ],
})
export class AppModule {}
齐活!现在可以请求到数据了!
JWT 登录鉴权流程,中间件的使用
JWT(JSON Web Token)是实现用户登录态管理的主流方式之一。在 NestJS 中,我们通常使用 @nestjs/passport 和 passport-jwt 模块实现 JWT 验证流程。
整个实现大致分为以下几个步骤:
下载依赖:
pnpm add @nestjs/passport passport passport-jwt
pnpm add passport-jwt @nestjs/jwt
新建对用的 auth 模块:
代码比较多,就不放这里了,感兴趣的小伙伴可以看这里!
github.com/mmdctjj/sou…
配置 model:
// src/app.module.ts
import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR, APP_GUARD } from '@nestjs/core';
import { ConfigModule } from '@nestjs/config';
import { UserController } from './controllers/user';
import { UserService } from './services/user';
import { JwtAuthGuard } from './auth/jwt-auth.guard';
import { AuthModule } from './auth/auth.module';
import { AuthController } from './auth/auth.controller';
import { AuthService } from './auth/auth.service';
@Module({
  imports: [
    ConfigModule.forRoot(), // 自动读取 .env 文件
    AuthModule,
    JwtModule.register({
      secret: process.env.JWT_SECRET,
      signOptions: { expiresIn: '1d' },
    }),
  ],
  controllers: [
    UserController,
    AuthController,
  ],
  providers: [
    UserService,
    AuthService,
  ],
})
export class AppModule {}
齐活!现在请求接口,会得到 401
这一整套流程非常契合企业级开发对安全性和规范性的要求。
最后
NestJS 的魅力在于让 Node.js 项目拥有可维护、可测试、可扩展的架构基础。如果你正在寻找一个可以在中大型项目中放心使用的 Node.js 框架,NestJS 是一个值得尝试的选择!