记录使用nest.js搭建个人博客的一些学习分享,通过使用和笔记希望可以让自己学的更扎实,对知识点的掌握更熟练。今日,先做项目的搭建,能访问应用就算成功。
起步
搭建一个nest.js
的项目非常简单,通过npm
我们就可以轻松做到,如下:
npm
安装:
npm i -g @nestjs/cli
- 安装项目:
nest new project-name
安装nestjs
的脚手架后,我们就可以通过它创建一个新的项目,其目录结构如下图:
目录结构
可以看到上图,初始化的nestjs
项目目录结构十分简单,在src
下面就只有5个文件,下面我们就分别看看是干嘛的。
main.ts
首先从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();
发现main.ts
就做了一件事情:引入AppModule
并且通过NestFactory
这个工厂函数来创建一个监听3000
端口的服务。
app.module.ts
接下来打开app.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 {}
可以看到模块文件会通过装饰器@Module
来装饰,这也是nestjs
的一个特点:
nestjs
号称是js
的spring
,就是因为很多地方都是借鉴模仿的spring
; 从main.ts
里面的代码就可以看出来挺像springboot
的了,下面分别介绍里面的三个属性:
属性 | 作用 |
---|---|
imports | 用于引入其他的模块 |
controllers | 用于引入其他的Controller |
providers | 用于引入其他的Provider,上面引入的Service也是Provider的一种 |
所以我们知道这里的app.module.ts
是用于引入AppController
控制器和AppService
服务。
app.controller.ts
接下来,我们就可以去看app.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
来修饰的,并且在构造函数内部,有这一行代码:
private readonly appService: AppService
,这行代码表示注册对应的服务;
注册服务后,就可以发现在getHello
中通过this
来调用服务(这里并没有赋值,但是却能用this
调用后面会说),控制器的每个方法就是每个请求对应的接口,例如这里的getHello
,由@Get
来声明表示为一个get
请求。
app.service.ts
再看app.service.ts
这个文件的内容,发现也很简单:
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
这个文件唯一不同的,就是使用了@Injectable
装饰器来装饰了类,这个装饰器的作用就是:依赖注入,这个概念是spring
非常出名的了。
这里就简单解释一下,通过@Injectable
装饰的对象,我们在使用时,就可以只定义(具体赋值由nest
来管理),如上面的app.controller.ts
使用AppService
时一样。
app.controller.spect.ts
最后,再看app.controller.spect.ts
这个文件,内容如下:
import { Test, TestingModule } from '@nestjs/testing';
import { AppController } from './app.controller';
import { AppService } from './app.service';
describe('AppController', () => {
let appController: AppController;
beforeEach(async () => {
const app: TestingModule = await Test.createTestingModule({
controllers: [AppController],
providers: [AppService],
}).compile();
appController = app.get<AppController>(AppController);
});
describe('root', () => {
it('should return "Hello World!"', () => {
expect(appController.getHello()).toBe('Hello World!');
});
});
});
发现其就是一个单元测试文件,一般开发可以不管,这个是保证代码的一个质量的,是另一个内容了,先不管。
启动服务
通过npm run start
命令,我们可以很快的启动一个服务,启动后可以在浏览器看到以下内容:
这样,就算是跑通了nest.js
的项目,简单完成了目标。
总结
今天学习到以下几点:
npm install -g @nestjs/cli
安装nest
的脚手架;nest new project-name
新建一个nest
项目;nest.js
是参考spring
的,所以项目充斥着大量装饰器来构建应用;- 接触到装饰器如下:
- @Module:表示该对象是一个模块对象;
- @Controller:表示该对象是一个控制器对象;
- @Get:表示该函数是一个Controller的接口方法;
- @Injectable: 表示该对象是一个可以依赖注入的对象。
这次的学习总结就到此为止了,To be continue...