看过我文章的朋友都知道,我前段时间用egg实现了一个七牛云的上传工具,还没看过的朋友可以进入我的主页找找看。这个工具功能主要是把七牛云常用的几个功能通过SDK扩展的方式集成到自己的系统里面,那么有人会问这个工具的价值在哪?
- 1、降低使用成本
我们使用七牛上传图片视频等文件,初次使用的人还真的要花几分钟摸索,有了这个工具就直接打开网页使用,几乎零学习成本,包含了
上传、覆盖上传、cdn刷新、文件预览等功能 - 2、利于七牛云的账号管理 众所周知,七牛云管理的资源都是咱们公司系统线上媒体资源,如果账号密码分发给了多人会造成很大的风险,先不谈人的故意行为,一个误操作就可能影响线上系统的正常运行。有了这个工具就可以在扩展的系统里做一个用户管理功能,把风险降到最低,即使操作不当也是不会出问题
那为什么又要用Nestjs来实现一遍呢,说白了都是卷,再一个这个框架在npm上每周的下载量都到达200w,那可谓是行走江湖的必备良药啊,安排上。接下来我会通过一系列的文章来记录这个过程,也是践行我认为非常好的学习方法费曼学习法,废话不多说,开搞!
NestJs中文文档:
https://www.kancloud.cn/juukee/nestjs/2666734,https://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
- 全局安装脚手架
$ npm i -g @nestjs/cli
$ nest new project-name
-
项目结构
-
启动
# 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 // 启动,会监听代码的改变自动热重载
- 运行
一个 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,repository, factory, helper 等等。 他们都可以通过 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了
常用的装饰器
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请求进行响应。同时它们可以接受一个字符串或一个字符串数组作为参数,这里的字符串可以是固定的路径,也可以是通配符。
| 装饰器 | 请求方法 |
|---|---|
@Get | get |
@Post | post |
@Put | put |
@Patch | patch |
@Delete | delete |
| 等等... |
实现第一个接口
可以直接执行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搭建七牛云工具的其他内容,敬请期待!记得一键三连哦!