优雅,太优雅了,NestJS 实在是太优雅了!
2025-05-04 08:07 阅读(46)

前言

在 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

这一整套流程非常契合企业级开发对安全性和规范性的要求。

https://www.zuocode.com

最后

NestJS 的魅力在于让 Node.js 项目拥有可维护、可测试、可扩展的架构基础。如果你正在寻找一个可以在中大型项目中放心使用的 Node.js 框架,NestJS 是一个值得尝试的选择!