今天docker遇到了一直打不开的问题,一直报error,win版本不对,后来折腾到半夜才解决,看这篇文章,里面还有对WIN10家庭版怎么运行docker的描述。
回到正题,今天要分享的是今年Node.js势头最猛框架Nest.js。
前面我们也介绍过一些小而美的框架,准确的说他们并不算是框架,只是实现HTTP的封装库而已,但是他们围绕自身的完善的生态让他们有了媲美框架的功能性和灵活敏捷的特性,从这个角度看,Flask,Koa,Express都是属于这个范畴。
我之前说过,我很喜欢Flask的设计,因为有一种自己掌握的感觉,但是我也很喜欢Nuxt.js的设计,因为封装了SSR,其脚手架更是封装了很多我们一定会使用的东西,还有类似你可以自己选择后端框架的权力。而我选择Nest.js和Nuxt的初衷有些相似,最重要的一点是我看中了nest里面封装了swagger ,以很方便的生成接口文档,并且是动态文档,非常好用!
同时next默认的HTTP库使用的是express,虽然我很想知道为什么不用koa,但是也无所谓,毕竟async等方法都有。第二点就是nest是用TS写的,同志们,据本博客上一次提TS已经过了快两个月了!你还记得TS是啥吗。。。
第三点就是nest给我一种和flask很像的感觉,一样的到处充满了装饰器,一样的丰富的 cli功能,甚至nest比flask的命令还要丰富。
冲着这么方便的特性,毫无疑问这是我未来一个月构建一个稍微中型一点的项目的不二选择。
简单说一下安装:
$ npm i -g @nestjs/cli
$ nest new project-name
全局安装并且使用nest new创建新项目,就和vue create一样吧。
因为TS和vscode集成的非常好,所有很多人都是推荐使用vscode去写nest的,我个人因为更喜欢webstorm所以还是用webstorm做的,当然除非你和我一样有病,不然还是用vscode吧!
脚手架搭建的工程大致结构如图,熟悉的package.json就不说了,这里他会生成自动的test文件夹,存放测试代码,我们也可以先不看,主要还是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();
没有发现我们久违的ts语法,很好理解,nestfactory是用来创建应用实例的,然后监听3000端口,等待入栈的HTTP请求。关于底层的HTTP框架,nest并没有说非得用哪一个,理论是他是可以用任何一个的,但是nest封装好的可以开箱即用的只有express和fastify,以便于我们去利用这两个框架带来的丰富的生态。
然后我们先运行一下:
$ npm run start
在本地的3000我们会看到hello world。怎么得到的呢?我们来看一下service和controller中的文件:
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
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();
}
}
终于看到我们熟悉的ts语法了,意外惊喜还有!熟悉的装饰器,仔细想想没写flask的日子仿佛不比ts少多少。没学过的话可能写会难一点,这种类似于大范围使用装饰器的方式,所以大家从flask转node的话,nest也是非常容易上手的框架。
最后一个文件就是module了:
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
说实话这个没怎么接触过angular的人还是会看的一脸懵逼的,比如我,但是大致意思还是了解的,因为nest宗旨是模块化,因此可以把这个文件堪称个根目录,去调用controller,然后controller里面再注入service,再去调用service。
先讲到这里,下一章讲一下我最喜欢的swagger文档生成和丰富的命令行工具!这是我非常喜欢nest的两个地方。