当前位置: 首页 > 工具软件 > nest-cli > 使用案例 >

【nest】nest学习笔记(一)

万俟承望
2023-12-01

前言

  • 最近在学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
  • 创建user模块
nest g mo user
  • 创建user控制器
nest g co user
  • 创建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');
  }
 类似资料: