前言
在 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 是一个值得尝试的选择!