Nestjs入门学习之搭建七牛云工具系列一

615 阅读5分钟

截屏2022-06-09 上午10.15.32.png 看过我文章的朋友都知道,我前段时间用egg实现了一个七牛云的上传工具,还没看过的朋友可以进入我的主页找找看。这个工具功能主要是把七牛云常用的几个功能通过SDK扩展的方式集成到自己的系统里面,那么有人会问这个工具的价值在哪?

  • 1、降低使用成本 我们使用七牛上传图片视频等文件,初次使用的人还真的要花几分钟摸索,有了这个工具就直接打开网页使用,几乎零学习成本,包含了上传、覆盖上传、cdn刷新、文件预览等功能
  • 2、利于七牛云的账号管理 众所周知,七牛云管理的资源都是咱们公司系统线上媒体资源,如果账号密码分发给了多人会造成很大的风险,先不谈人的故意行为,一个误操作就可能影响线上系统的正常运行。有了这个工具就可以在扩展的系统里做一个用户管理功能,把风险降到最低,即使操作不当也是不会出问题

那为什么又要用Nestjs来实现一遍呢,说白了都是卷,再一个这个框架在npm上每周的下载量都到达200w,那可谓是行走江湖的必备良药啊,安排上。接下来我会通过一系列的文章来记录这个过程,也是践行我认为非常好的学习方法费曼学习法,废话不多说,开搞!

NestJs中文文档:https://www.kancloud.cn/juukee/nestjs/2666734https://docs.nestjs.cn/
NestJs官方文档:https://docs.nestjs.com/

介绍

Nest (NestJS) 是一个用于构建高效、可扩展的Node.js服务器端应用程序的框架。它使用渐进式 JavaScript,使用 TypeScript 构建并完全支持TypeScript(但仍允许开发人员使用纯 JavaScript 进行编码),并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式反应式编程)的元素。

这个框架它是受java spring框架的启发而研发出来的,而Java又是沉淀了很多年的非常优秀的框架,可想而知nestjs的价值

Hello World

  1. 全局安装脚手架
$ npm i -g @nestjs/cli
$ nest new project-name
  1. 项目结构 image.png

  2. 启动

# 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();
npm run start      // 启动
npm run start:dev  // 启动,会监听代码的改变自动热重载
  1. 运行 image.png

一个 hello world 程序就完成了!是不是很简单~

项目介绍

├── dist      项目编译出来的运行包
├── src       源码
    ├── app.controller.spec.ts     // controller测试文件
    ├── app.controller.ts          // 控制器文件
    ├── app.module.ts              // app模块
    ├── app.service.ts             // service文件
    ├── main.ts                    // 项目入口文件
├── test
├── .eslintrc.js
├── .gitignore
├── .prettierrc
├── nest-cli.json
├── package.json
├── pnpm-lock.yaml
├── README.md
├── tsconfig.build.json
├── tsconfig.json

其实,其他的文件我们都不用太关注,搞清楚src内的文件作用就OK

在开始第一个接口之前先把 Controller、Providers、Module 这几个概念搞清楚

Controller: 控制器负责处理传入的请求并将响应返回给客户端。

Providers: Providers 是 Nest 的一个基本概念。许多基本的 Nest 类可能被视为 provider - service,repositoryfactoryhelper 等等。 他们都可以通过 constructor注入依赖关系。 提供者的主要思想是它可以作为依赖注入,这意味着对象可以彼此创建各种关系,并且“连接”对象实例的功能在很大程度上可以委托给 Nest运行时系统。 Provider 只是一个用 @Injectable() 装饰器注释的类。

module:  装饰器接受一个描述模块属性的对象

标题
providers由 Nest 注入器实例化的提供者,并且可以至少在整个模块中共享
controllers必须创建的一组控制器
imports导入模块的列表,这些模块导出了此模块中所需提供者
exports由本模块提供并应在其他模块中可用的提供者的子集。

nest脚手架能力

nest脚手架提供了一套非常香的能力,新建模块、controller、service等等,只需执行一行命令就OK了,用一次便会爱上它。

# 查看全部命令
nest g -h
# 新建用户模块
nest g module user  or  nest g mo user
# 给用户模块新建一个controller
nest g controller user  or  nest g co user

其他的命令也都大同小异,稍微注意下文件的层级关系就OK了

image.png

常用的装饰器

Request对象代表HTTP请求,并具有请求查询字符串、参数、HTTP 标头(HTTP header) 和 正文(HTTP body)的属性(在此处阅读更多内容)。在大多数情况下,没有必要手动获取这些属性。我们可以使用开箱即用的专用装饰器,例如@Body()或者@Query()。下面是Nest提供的装饰器列表以及它们所代表的底层平台特定对象的对照列表。

@Request(),@Req()req
@Response(),@Res()*res
@Next()next
@Session()req.session
@Param(key?: string)req.params/req.params[key]
@Body(key?: string)req.body/req.body[key]
@Query(key?: string)req.query/req.query[key]
@Headers(name?: string)req.headers/req.headers[name]
@Ip()req.ip
@HostParam()req.hosts

HTTP方法处理装饰器,经过它们装饰的方法,可以对相应的HTTP请求进行响应。同时它们可以接受一个字符串或一个字符串数组作为参数,这里的字符串可以是固定的路径,也可以是通配符。

装饰器请求方法
@Getget
@Postpost
@Putput
@Patchpatch
@Deletedelete
等等...

实现第一个接口

可以直接执行nest g resource user 或者是 nest g module user | nest g co user | nest g s user

# user.module.ts
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';

@Module({
  controllers: [UserController],
  providers: [UserService],
})
export class UserModule {}
# user.controller.ts

import { Controller } from '@nestjs/common';
import { UserService } from './user.service';

@Controller('user')
export class UserController {
    constructor(private userService: UserService) {}
    
    @Get('login')
    async index() {
        return await this.userService.login();
    }
    
    @Post('create')
    async create() {
        return await this.userService.create();
    }
}

修饰符@Controller('user')代表 user 控制器路由的前缀,完整路由拼接:http://localhost:3000/user/login

# user.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class UserService {
    login() {
        return 'login test';
    }
    create() {
        return 'create a user';
    }
}

我们一般会在controller内处理用户的请求、响应以及参数的校验,在service内处理逻辑相关的crud操作

到这里,一个简单的接口就完成了!

写在后面

看完这篇文章你应该对nestjs有了大致的了解,后面我会继续分享nestjs搭建七牛云工具的其他内容,敬请期待!记得一键三连哦!