1.前言
嘿,大家好啊!今天我想跟你们聊聊 Nest.js 后端开发框架!因为工作需要,我学了一段时间 nest.js,发现它特别好用。我花了点时间总结了一下,这个系列我会通过实现一个员工管理系统后台接口讲解,这篇文章是作为系列第一篇文章。
2.Nest.js 的定位和应用领域
NestJS是目前Node平台上最受欢迎的企业级开发框架之一,其提供了IOC、AOP、微服务等架构特性。通常情况下,Node应用的开发可以分为三个层次:
- 直接使用http、https包的createServer API
- 使用像express、koa这样的请求响应处理库,
- 使用像nest、egg、midway这样的企业级框架。
为什么我会选择 NestJS 呢?这是因为开发物料管理系统,考虑到以下成本:
- 人力成本,前端 Node 全栈,节省人力
- 学习成本
- 维护成本
- 扩展成本
- ...
CreateServer api
建立服务适用于简单的场景,例如工具所提供的开发服务。
javascript
const http = require('http');
const fs = require('fs');
const path = require('path');
const server = http.createServer((req, res) => {
// 处理静态文件请求
const filePath = path.join(__dirname, 'public', req.url);
fs.readFile(filePath, (err, data) => {
if (err) {
// 处理文件不存在的情况
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('File not found');
} else {
// 返回文件内容
res.writeHead(200, { 'Content-Type': 'text/html' });
res.end(data);
}
});
});
const PORT = 3000;
server.listen(PORT, () => {
console.log(`Server is running at http://localhost:${PORT}`);
});
Express
优点:简洁,适合开发简单的服务端应用
缺点:没有过多的封装
javascript
const express = require('express');
/* 中间件 */
app.use((req, res, next) => {
console.log('middleware');
next();
console.log('middleware call');
})
/* 路由部分 */
const router = express.Router();
router.get('/', (req, res) => {
res.send('Home');
});
app.use(router);
/* 静态文件 */
app.use(express.static('./'));
app.listen(3000);
Koa
优点:不绑定任何的框架,支持 async、await 异步
缺点:视图、路由、文件上传、日志管理等都不提供,100个人有100种搭配
javascript
const Koa = require('koa');
const Router = require('koa-router');
const serve = require('koa-static');
const app = new Koa();
const router = Router();
/*中间件*/
app.use(async (ctx, next) => {
console.log('middleware');
next();
console.log('middleware call');
});
/* 路由部分 */
router.get('/', ctx => {
ctx.body = 'Home';
});
app.use(router.routes());
/* 静态文件 */
app.use(serve('./'));
app.listen(3000);
Egg
优点:约定大于配置
缺点:开发体验不好,生态维护力度低,不支持 TypeScript
Nest
优点:
- 企业级应用框架,构建高度可扩展易于维护的应用程序。
- 支持模块化架构和依赖注入。
- 强大的生态系统和插件支持
缺点:学习成本相对于 Express、Koa 高,接受思维后开发快,维护成本低。
javascript
// 装饰器路由是个好东西,路由直接标志在函数头上
@Controller()
export class UserController {
@Get('users')
getAllUsers()
@Get('users/:id')
getUser() {}
@Post('users')
addUser() {}
}
模块见依赖注入
javascript
// Modules,Controllers,Components 之间通过依赖注入相关关联,它们通过同名的 @Module、@Controller、@Component 装饰器声明
@Controller()
export class UsersController {
@Get('users')
getAllUsers()
}
@Injectable()
export class UsersService {
getAllUsers() {
return [];
}
}
@Module({
controllers: [UsersController],
providers: [UserService]
})
export class ApplicationModule {}
3.如何创建一个简单的 Nest.js 应用程序
3.1 NestJS 基本概念
实现了一个 HelloWorld,现在我们需要了解下 NestJS 的基本概念,先了解最基本的概念,比如装饰器、依赖注入,这里先说装饰器。
NestJS 提供了大量的装饰器供我们使用,前面用到 @Module
、@Controller
、@Get
都是装饰器,使用非常方便。
模块
Nest JS 用模块组织应用程序结构的,每个模块封装一组密切相关的功能。
@Modules
providers
controllers
imports
Exports
控制器
处理客户端的请求路由转发器
请求方法
@Get、@Post 这些就是对应 HTTP 请求方法的装饰器。
3.2 CLI 命令行工具
NestJS 可以开发各种应用,我们需要做一个员工部门管理系统的 rest 应用。NestJS 提供了快速创建应用的命令行工具。
首先安装命令行工具,要求 node 版本大于 12
bash
npm i -g @nestjs/cli
检测是否安装成功
bash
nest --version
查看可以使用的命令
新创建一个项目
3.3 项目结构和基本配置
运行 npm run start:dev
启动程序,可以看到打印日志如下
查看入口文件 main.ts
,可以看到启动端口为 3000
打开 postman 访问 3000 端口,获得响应 Hello World。
现在我们去看看具体是怎么实现的
首先是入口文件引入了 AppModule 模块,然后调用了 bootstrap 函数
javascript
// src/main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
AppModule 使用 @Module
装饰器声明了该类,并注册了 AppController 和 AppService
javascript
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
继续看 AppController ,可以看到这里使用 @Controller
装饰器声明该类,@Get
声明了 getHello 方法,可以看到这里应该就是返回 Hello 文本的地方了
javascript
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
AppService 是这样声明的
javascript
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
相信看到这里,你能够猜测 Controller 是控制 restApi 路由的地方,而 @Get() 声明的方法就是具体的 Http 请求方法,AppService 则是负责业务逻辑的处理,这样职责分明,清晰明了。
小结
NestJS是目前Node平台上最受欢迎的企业级开发框架之一,其提供了IOC、AOP、微服务等架构特性,可以通过各种装饰器比如 @Controller、@Get 等快速开发接口。