模块 module
控制器 controller
服务 service
中间件 middleware
守卫 guard
中间件
- 执行代码
- 更改请求/响应对象
- 结束请求-响应周期
- 调用堆栈下一个中间件
- 当前中间件未结束请求-响应周期,需调用next()将控制权传递给下一个中间件,否则请求会一直挂起;
管道
- 转换:将输入的数据转换为需要的格式
- 验证:验证输入的数据,如果正确就返回,错误则抛出异常
守卫
守卫是单一职责的;它们根据运行出现的条件(如权限、角色、ACL等)来确定给定的请求是否由路由处理,简称授权;
拦截器
- 在方法执行前/后加入自定义逻辑
- 转换/包装一个方法返回的结果
- 转换/包装一个方法抛出的异常
- 扩展基础方法的内容
- 根据情况覆盖/重写一个方法
装饰器
常用命令
# 创建项目
nest new project-name
# 创建子项目
nest g app sub-project-name
# 创建公共库
nest g lib lib-name
# 创建控制器
nest g co controller-name
# 创建模块
nest g mo module-name
# 创建服务
nest g s service-name
# 创建中间件
nest g mid mid-name
# 创建过滤器
nest g f common/filters/http-exception
HTTP状态码
Nest内置状态码:
enum HttpStatus {
OK = 200, //成功响应
CREATED = 201, // 该请求已成功,并因此创建了一个新的资源。这通常是在POST请求,或是某些PUT请求之后返回的响应。
ACCEPTED = 202,// 请求已经接收到,但还未响应,没有结果
PARTIAL_CONTENT = 206, // 服务器已经成功处理了部分 GET 请求。类似于 FlashGet 或者迅雷这类的 HTTP 下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。该请求必须包含 Range 头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range 来作为请求条件。
AMBIGUOUS = 300, // 被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。
MOVED_PERMANENTLY = 301, //被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一
FOUND = 302,// 请求的资源现在临时从不同的 URI 响应请求。
SEE_OTHER = 303,// 对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。
NOT_MODIFIED = 304, // 如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。
BAD_REQUEST = 400, // 语义有误,当前请求无法被服务器理解;请求参数有误。
UNAUTHORIZED = 401,// 当前请求需要用户验证。
FORBIDDEN = 403,// 服务器已经理解请求,但是拒绝执行它。
NOT_FOUND = 404,// 请求失败,请求所希望得到的资源未被在服务器上发现。
METHOD_NOT_ALLOWED = 405,// 请求行中指定的请求方法不能被用于请求相应的资源
PROXY_AUTHENTICATION_REQUIRED = 407, //与401响应类似,只不过客户端必须在代理服务器上进行身份验证。
REQUEST_TIMEOUT = 408,// 请求超时
CONFLICT = 409,// 由于和被请求的资源的当前状态之间存在冲突,请求无法完成。
INTERNAL_SERVER_ERROR = 500, // 服务器遇到了不知道如何处理的情况。
NOT_IMPLEMENTED = 501,// 此请求方法不被服务器支持且无法被处理。
BAD_GATEWAY = 502,// 此错误响应表明服务器作为网关需要得到一个处理这个请求的响应,但是得到一个错误的响应。
SERVICE_UNAVAILABLE = 503,// 服务器没有准备好处理请求。
GATEWAY_TIMEOUT = 504,// 当服务器作为网关,不能及时得到响应时返回此错误代码。
HTTP_VERSION_NOT_SUPPORTED = 505 // 服务器不支持请求中所使用的HTTP协议版本。
}
HTTP响应状态码:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
依赖注入
// CatsModule
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Module({
imports: [],
controllers: [CatsController],
providers: [CatsService],
exports: [CatsService]
})
export class CatsModule { }
报错提示:
[ExceptionHandler] Nest can't resolve dependencies of the CatsController (?). Please verify whether [0] argument is available in the current context.
这个错误的意思是说,Nest不能处理CatsController
中的依赖关系,即他无法自动的将CatsController
构造器中的第一个依赖注入到IOC容器中;
这里的当前上下文指的就是 CatsModule
,因为 CatsController
要依赖 CatsService
来完成其功能,但是在当前上下文又找不到 CatsService
这个实例(对象),所以 Nest 在启动的时候才会出现这种错误。
通俗的讲,如果要在 controllers
中的类使用当前模块的其他提供者(Provider
),那么就必须将其增加到当前模块的 providers
中去。
上述只是说明了在一个模块中,如何让 Module
去管理 controllers
和 providers
的依赖关系。但是,如果当前模块的 Controller
和 Provider
需要注入其他模块中的 Provider
呢?如果当前模块又需要给其他模块提供他的 Provider
呢?
这里就要用到 @Module()
注解中的 imports
和 exports
了,imports
告诉当前模块的 Controller
和 Provider
注入的非当前模块的 Provider
来自于哪个模块,而 exports
告诉当前模块要将他的哪些 Provider
提供给其他模块。
注意:如果要在当前模块使用其他模块的提供者,那么就必须在被导入的其他模块中,将该提供者放入 exports
数组中去。