一、官网
一定要认真学习官网内容!
NestJS 简介 | NestJS 中文文档 | NestJS 中文网
NestJS - A progressive Node.js framework
二、理解NestJS(内容来自官网)
2.1、理解NestJS
Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用 JavaScript 的渐进增强的能力,使用并完全支持 TypeScript (仍然允许开发者使用纯 JavaScript 进行开发),并结合了 OOP (面向对象编程)、FP (函数式编程)和 FRP (函数响应式编程)。
在底层,Nest 构建在强大的 HTTP 服务器框架上,例如 Express (默认),并且还可以通过配置从而使用 Fastify !
Nest 在这些常见的 Node.js 框架 (Express/Fastify) 之上提高了一个抽象级别,但仍然向开发者直接暴露了底层框架的 API。这使得开发者可以自由地使用适用于底层平台的无数的第三方模块。
2.2、NestJS哲学
近年来,由于 Node.js、JavaScript 已经成为 web 前端和后端应用程序的“通用开发语言”。这促成了诸如 Angular、React 和 Vue 等优秀项目的出现,他们提高了开发者的工作效率,并能够创建快速、可测试和可扩展的前端应用程序。然而,尽管 Node (和服务器端 JavaScript)拥有大量优秀的软件库、辅助程序和工具,但没有一个能够有效地解决我们所面对的主要问题,即 架构。这样也是本人很长时间以来期望的。
Nest 提供了一个开箱即用的应用程序体系结构,允许开发者及其团队创建高度可测试、可扩展、松散耦合且易于维护的应用程序。这种架构深受 Angular 的启发。
2.3、NestJS能力
1、后端开发。
2、其他。
2.4、NestJS对比Egg.js:
eggjs 停止更新 - OSCHINA - 中文开源技术交流社区
egg.js和nest.js的对比_程序员 小明的博客-CSDN博客_nestjs和eggjs哪个好
三、安装、启动NestJS项目
NestJS 简介 | NestJS 中文文档 | NestJS 中文网
3.1、创建一个新的项目目录,并使用核心的 Nest 文件和支撑模块填充该目录,从而为项目创建一个传统的基本结构。建议初学者使用 Nest CLI 创建新项目。
npm i -g @nestjs/cli cnpm i -g @nestjs/cli // 如速度慢可使用cnpm nest new project-name
3.2、启动项目
pnpm run start
启动成功
3.3、从src/main.ts文件,我们看到项目监听的是3000端口
我们访问本地项目 http://localhost:3000/
访问成功
四、NestJS项目目录介绍
+-- dist[目录] // 编译后的目录,用于预览项目 +-- node_modules[目录] // 项目使用的包目录,开发使用和上线使用的都在里边 +-- src[目录] // 源文件/代码,程序员主要编写的目录 | +-- app.controller.spec.ts // 对于基本控制器的单元测试样例 | +-- app.controller.ts // 控制器文件,可以简单理解为路由文件 | +-- app.module.ts // 模块文件,在NestJS世界里主要操作的就是模块 | +-- app.service.ts // 服务文件,提供的服务文件,业务逻辑编写在这里 | +-- app.main.ts // 项目的入口文件,里边包括项目的主模块和监听端口号 +-- test[目录] // 测试文件目录,对项目测试时使用的目录,比如单元测试... | +-- app.e2e-spec.ts // e2e测试,端对端测试文件,测试流程和功能使用 | +-- jest-e2e.json // jest测试文件,jset是一款简介的JavaScript测试框架 +-- .eslintrc.js // ESlint的配置文件 +-- .gitignore // git的配置文件,用于控制哪些文件不受Git管理 +-- .prettierrc // prettier配置文件,用于美化/格式化代码的 +-- nest-cli.json // 整个项目的配置文件,这个需要根据项目进行不同的配置 +-- package-lock.json // 防止由于包不同,导致项目无法启动的配置文件,固定包版本 +-- package.json // 项目依赖包管理文件和Script文件,比如如何启动项目的命令 +-- README.md // 对项目的描述文件,markdown语法 +-- tsconfig.build.json // TypeScript语法构建时的配置文件 +-- tsconfig.json // TypeScript的配置文件,控制TypeScript编译器的一些行为
五、Controller控制器-路由的创建
5.1、创建请求地址
创建 http://localhost:3000/name 的请求地址(接口地址)
src/service.ts
// 服务文件,提供的服务文件,业务逻辑编写在这里 import { Injectable } from '@nestjs/common'; @Injectable() export class AppService { getHello(): string { return 'Hello World Snow!'; } getName(): string { return 'SNOW!'; } }
src/controller.ts
// 控制器--编写路由 import { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; @Controller('api') // 添加顶层路径 api export class AppController { constructor(private readonly appService: AppService) {} @Get() getHello(): string { return this.appService.getHello(); } @Get('name') getName(): string { return this.appService.getName(); } }
访问成功。
5.2、添加顶层路径 api
访问成功 api/name
5.3、src下创建product模块
5.3.1、删除以下文件
5.3.2、app.module.ts删除对应的使用
5.3.3、新建module
nest g module products
5.3.4、创建controller
nest g controller products --no-spec
src/products/products.controller.ts
import { Controller, Get } from '@nestjs/common'; @Controller('products') export class ProductsController { @Get() getProductsList(): any{ return { code: 0, data: ['huawei', 'changcheng', 'biyadi'], msg: '请求产品列表成功' } } }
5.4、src/main.ts 设置默认前缀 api/
app.setGlobalPrefix('api/')
六、Controller控制器-使用products.service.ts写业务逻辑
6.1、把业务逻辑放在products.service.ts
这个文件中。nestjs规范。
nest g service products --no-spec
6.2、src/products/products.controller.ts 引入 service
import { ProductsService } from './products.service';
import { Controller, Get } from '@nestjs/common'; import { ProductsService } from './products.service'; @Controller('products') export class ProductsController { // this.productsService = new ProductsService() 等价于 constructor 方式 constructor(private productsService: ProductsService){} @Get() getProductsList(): any{ return this.productsService.getProductsList() } }
6.3、src/products/products.service.ts
import { Injectable } from '@nestjs/common'; @Injectable() export class ProductsService { getProductsList(){ return { code: 0, data: ['huawei', 'changcheng', 'biyadi'], msg: '请求产品列表成功' } } }