NestJS 快速入门

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 等快速开发接口。

相关推荐
蜗牛快跑2136 分钟前
面向对象编程 vs 函数式编程
前端·函数式编程·面向对象编程
Dread_lxy7 分钟前
vue 依赖注入(Provide、Inject )和混入(mixins)
前端·javascript·vue.js
涔溪1 小时前
Ecmascript(ES)标准
前端·elasticsearch·ecmascript
榴莲千丞1 小时前
第8章利用CSS制作导航菜单
前端·css
奔跑草-1 小时前
【前端】深入浅出 - TypeScript 的详细讲解
前端·javascript·react.js·typescript
羡与1 小时前
echarts-gl 3D柱状图配置
前端·javascript·echarts
guokanglun1 小时前
CSS样式实现3D效果
前端·css·3d
咔咔库奇1 小时前
ES6进阶知识一
前端·ecmascript·es6
前端郭德纲1 小时前
浏览器是加载ES6模块的?
javascript·算法
JerryXZR2 小时前
JavaScript核心编程 - 原型链 作用域 与 执行上下文
开发语言·javascript·原型模式