前言
- 最近在学nest,感觉这个框架写的真nb,而且感觉有点django的味道,不过据说是仿spring搞得,先玩玩试试。
- 另外,关于nest,个人觉得不建议新手以及不懂ts的人学,即使学会了,也只是知道个套路写法,并不是真正的会,对个人技术提升没有实质性帮助。
创建项目
npm install -g @nestjs/cli
nest-book git:(master) nest # 输入的命令
Usage: nest <command> [options]
Options:
-v, --version 查看当前nestjs-cli的版本
-h, --help 查看帮助
Commands:
new|n [options] [name] 生成一个新的项目
build [options] [app] 构建一个项目
start [options] [app] 运行项目
info|i 显示项目的具体信息
update|u [options] 升级之前的依赖包
add [options] <library> 将对外部库的支持添加到项目中。
generate|g [options] <schematic> [name] [path] Generate a Nest element.
Available schematics:
全称 别名(一般我们使用别名就可以)
┌───────────────┬─────────────┐
│ name │ alias │
│ application │ application │
│ class │ cl │
│ configuration │ config │
│ controller │ co │ ** 控制器
│ decorator │ d │ * 装饰器
│ filter │ f │ * 过滤器
│ gateway │ ga │ 网关
│ guard │ gu │ * 守卫
│ interceptor │ in │ * 拦截器
│ interface │ interface │ 接口
│ middleware │ mi │ 中间层
│ module │ mo │ ** 模块
│ pipe │ pi │ * 管道
│ provider │ pr │
│ resolver │ r │ graphql使用相当于上面的控制器
│ service │ s │ ** 创建服务
│ library │ lib │
│ sub-app │ app │
└───────────────┴─────────────┘
- 生成一个新项目,入口main.ts ,根模块app.module.ts
nest new yourproject
nest g mo user
nest g co user
nest g s user
基础理解
- 这个我也刚用,所以可能有理解不对的。
- nest是想把所有东西变成一个个模块,模块可以使用@Module的装饰器,传入参数可以导入导出或者使用多个控制器,多个服务。
- 控制器使用@controller装饰器,个人理解是用来处理跳转哪些服务的。controller里的参数就是路由地址。
- 服务使用@injectable装饰器,个人理解是用来返回逻辑之类的。
- 对于跨模块的导入导出,一个模块中控制器或服务导出后,可以在另一个模块中引入,其控制器可以通过this拿到导入的控制器或服务。
- 全局模块参考官网
- 动态模块https://docs.nestjs.com/fundamentals/dynamic-modules
- 这个动态模块有点复杂,有点奇怪。需要使用模块上的静态方法register导出,其中providers里提供服务以及前缀,并导出这个服务,provide代表@inject时的那个值,useValue就是动态传入的值。最后在需要使用动态模块的模块里以register静态方法导入,此时,这个prefix即为register的参数,此模块控制器通过this拿到服务调用方法。
- 模块中的依赖注入有3种方式,除了前面的useValue,还有useClass,useFactory+inject方式:
@Module({
imports: [],
controllers: [AppController],
providers: [
{
provide: 'LOG',
useClass: LogService,
},
{
provide: 'APP_SERVICE',
useFactory: (logger: LogService): string => {
console.log(logger);
logger.log('使用工厂方式');
return '工厂方法返回';
},
inject: ['LOG'],
},
{
provide: 'IS_DEV',
useValue: { isDev: true },
},
],
exports: [],
})
export class AppModule {}
生命周期
onModuleInit() {
console.log('OnModuleInit2');
}
onApplicationBootstrap() {
console.log('onApplicationBootstrap2');
}
onModuleDestroy() {
console.log('onModuleDestroy2');
}
beforeApplicationShutdown() {
console.log('beforeApplicationShutdown2');
}