使用nestjs搭建个人博客(一)—— 开始搭建

1,513 阅读3分钟

记录使用nest.js搭建个人博客的一些学习分享,通过使用和笔记希望可以让自己学的更扎实,对知识点的掌握更熟练。今日,先做项目的搭建,能访问应用就算成功。

起步

搭建一个nest.js的项目非常简单,通过npm我们就可以轻松做到,如下:

  • npm安装:
    npm i -g @nestjs/cli
  • 安装项目:
    nest new project-name

安装nestjs的脚手架后,我们就可以通过它创建一个新的项目,其目录结构如下图:

image.png

目录结构

可以看到上图,初始化的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号称是jsspring,就是因为很多地方都是借鉴模仿的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命令,我们可以很快的启动一个服务,启动后可以在浏览器看到以下内容:

image.png

这样,就算是跑通了nest.js的项目,简单完成了目标。

总结

今天学习到以下几点:

  1. npm install -g @nestjs/cli安装nest的脚手架;
  2. nest new project-name新建一个nest项目;
  3. nest.js是参考spring的,所以项目充斥着大量装饰器来构建应用;
  4. 接触到装饰器如下:
    1. @Module:表示该对象是一个模块对象;
    2. @Controller:表示该对象是一个控制器对象;
    3. @Get:表示该函数是一个Controller的接口方法;
    4. @Injectable: 表示该对象是一个可以依赖注入的对象。

这次的学习总结就到此为止了,To be continue...