Nest.js 从零到壹详细系列(一):项目创建&文件分析前言 不想了解后端的前端不是好前端,相信大家之前看到过,做前端
前言
不想了解后端的前端不是好前端,相信大家之前看到过,做前端的上限是前端组长之类的文章。那么前端如何打破这一上限呢?那最好的方式,是在做好前端的同时,也去了解后端的知识。
Nest是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架。在底层,Nest使用了Express(默认)框架和Fastify 框架。
一、项目创建
项目环境:
node >=16
nestjs: 10.0.0
1. 全局安装nest脚手架
npm i -g @nestjs/cli
2. 创建nest项目
nest new nest-seed
输入完后,会初始化,此时,会问你使用哪一种方式来管理依赖包,任选一种即可。
项目创建成功后,因为包含ESLint校验,可能会遇到ESLint报错信息:Delete ␍ eslintprettier/prettier。
解决方案:修改.eslintrc.js,在"rules"下添加
"prettier/prettier": ["error", { "endOfLine": "auto" }]
为了修复后续ESLint问题,vscode 设置保存自动格式化。新建.vscode文件夹,在.vscode下新建 settings.json
{
"editor.codeActionsOnSave": {
"source.fixAll": "explicit"
}
}
3. 目录结构
此时的src目录结构为
src
├── app.controller.spec.ts
├── app.controller.ts
├── app.module.ts
├── app.service.ts
└── main.ts
app.controller.spec.ts:针对控制器的单元测试
app.controller.ts:单个路由的基本控制器,负责处理传入的请求和向客户端返回响应
app.module.ts:应用程序的根模块
app.service.ts:带有单个方法的基本服务,用于处理请求的具体逻辑
main.ts:应用程序入口文件。它使用 NestFactory 用来创建 Nest 应用实例
4. 启动程序
运行yarn start
启动程序。如果需要监听文件的变动,运行yarn start:dev
。
启动之后,访问localhost:3000,可看到页面显示“Hello World!”
接下来对文件进行分析,看下“Hello World!”是怎么生成的。
二、文件分析
1. 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();
使用 NestFactory.create()
来创建一个 NestJS 应用程序的实例,并监听端口3000上的请求。
2. app.module.ts
app.module.ts是一个模块文件,以.module.ts结尾。
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
在app.module.ts中,@Module()
装饰器接受一个描述模块属性的对象:
属性 | 说明 |
---|---|
imports | 导入子模块 |
controllers | 导入控制器 |
providers | 由 Nest 注入器实例化的提供者,并且可以至少在整个模块中共享 |
module的内容不多,主要用来用于定义和配置模块的核心文件。
3. app.controller.ts
app.controller.ts是一个控制器文件,以.controller.ts结尾。
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();
}
}
使用 @Controller()
装饰器定义一个基本的控制器,控制器负责处理传入的请求和向客户端返回响应。
构造函数使用依赖注入机制注入了 AppService 实例(在module中配置的providers: [AppService],)。private readonly 表示 appService 是私有的并且不可更改。
constructor(private readonly appService: AppService) {}
//等同于
private readonly appService:AppService;
constructor(appService:AppService) {
this.appService=appService;
}
@Get(): 此装饰器定义了一个处理HTTP GET请求的方法。默认情况下,该方法将处理根URL(即 /)上的GET请求。因此当访问localhost:3000时,会调用getHello方法。
getHello方法调用了 AppService 的 getHello 方法。接下来继续看appService中的内容。
提示:在controller中,不要编写过多的业务逻辑,复杂的逻辑应交给service处理
4. app.service.ts
app.service.ts是一个service文件,以.service.ts结尾。主要用于处理复杂的业务逻辑。
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
使用@Injectable()
装饰器用于标记类为可以被依赖注入系统管理的服务,即在module中被providers。
getHello方法返回字符串'Hello World!',因此在app.controller.ts中,调用this.appService.getHello()返回的结果是'Hello World!',访问localhost:3000接口的结果为'Hello World!'。
三、创建模块
通过上文,熟悉了NestJS的设计模式,主要就是 Controller
、Service
、Module
共同形成了一个模块。
Controller
:传统意义上的控制器,提供 api 接口,负责处理路由、中转、验证等一些简洁的业务;Service
:又称为Provider
, 是一系列服务、repo、工厂方法、helper 的总称,主要负责处理具体的业务,如数据库的增删改查、事务、并发等逻辑代码;Module
:负责将Controller
和Service
连接起来,类似于namespace
的概念;
使用 nest-cli 提供的指令可以快速创建文件,语法如下:
nest g [文件类型] [文件名] [文件目录]
文件目录如果不提供,默认为文件名。
1. 创建模块
nest g module posts
执行完命令后,我们可以发现在根模块app.module.ts中的@Model装饰器的imports中自动引入了PostsModule
命令可简写为:
nest g mo posts
2. 创建控制器
--no-spec:不生成测试文件
nest g controller posts --no-spec
创建posts.controller.ts文件,并且在posts.module.ts文件下,@Module装饰器的controllers中自动注入
命令可简写为:
nest g co posts --no-spec
3. 创建服务类
nest g service posts --no-spec
创建posts.service.ts文件,并且在posts.module.ts文件下,@Module装饰器的providers中自动注入
命令可简写为:
nest g s posts --no-spec
提示:注意创建顺序,先创建Module,再创建Controller和Service,这样创建出来的文件在Module中自动注册。
总结
本人的文章都比较详细,比较通俗易懂,想学Nest的可先关注我,后续会继续更新Nest相关的文章。
参考文章:
转载自:https://juejin.cn/post/7403552860456058906