兼容 TypeScript 和纯 JavaScript
Nest 是一个用于构建高效、可扩展的Node.js服务器端应用程序的框架。它使用现代 JavaScript,使用TypeScript构建 (保留与纯 JavaScript 的兼容性)并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式响应式编程)的元素。
在底层,Nest 使用了Express,但也提供了与广泛的其他库的兼容性,例如Fastify,允许轻松使用无数可用的第三方插件。
开始
创建一个文件夹
$ npm i -g @nestjs/cli 安装nest
$ nest new project-name 创建一个项目
$ cd project-name 切到目录下
$ npm install 安装
$ npm run start 运行
此命令将监视您的文件,自动重新编译并重新加载服务器
npm run start:dev 跟随文件内容变动自动重新加载服务器
crud一次生成
包含了dto、entity、controller、module、service
nest g resource [name]
controller常用装饰器
@HttpCode(204)
@Header('Cache-Control', 'none')
@Redirect('https://nestjs.com', 301)
请求参数
(@Req() request: Request): string
@Body(key?: string)
@Query(key?: string)
@Headers(name?: string)
(@Param() params): string ----- @Param('id') id: string
响应参数
@Res({ passthrough: true }) res: Response
使用类class定义dto
不使用ts的原因:由于 TypeScript 接口在转换过程中被删除,所以 Nest 不能在运行时引用它们
(@Body() createCatDto: CreateCatDto)
使用service
export class CatsController {
constructor(private catsService: CatsService) {}
}
模块共享
@Module({
controllers: [CatsController],
providers: [CatsService],
exports: [CatsService] }) //共享service
export class CatsModule {}
全局模块
@Global()
@Module({....exports: [CatsService]}
@Global 装饰器使模块成为全局作用域。全局模块应该只注册一次,最好由根或核心模块注册。CatsService将无处不在
配置参数验证pipe
有内置的pipe直接使用
- `ParseIntPipe`
- `ParseFloatPipe`
- `ParseBoolPipe`
- `ParseArrayPipe`
- `ParseUUIDPipe`
- `ParseEnumPipe`
- `DefaultValuePipe`
- `ParseFilePipe`
使用class-transformer和ValidationPipe配置全局的类验证器 使用方式:
import { IsString } from 'class-validator';
export class CreateCatDto {
@IsString() name: string;
}
@Post()
async create( @Body() createCatDto: CreateCatDto, ) {
this.catsService.create(createCatDto);
}
只需要写一个validate.pipe.ts,再全局1⃣️配置就行了
配置版本号
响应状态吗
开箱即用的装饰器
库特定模式---要自己负责管理响应
当您在方法处理程序中注入@Res()或时@Response(),您将 Nest 置于该处理程序的库特定模式,并且您负责管理响应。这样做时,您必须通过调用对象response(例如res.json(...)或res.send(...))发出某种响应,否则 HTTP 服务器将挂起。
DTO
有趣的是,我们建议在这里使用类。为什么?类是 JavaScript ES6 标准的一部分,因此它们在编译后的 JavaScript 中作为真实实体保存。另一方面,由于 TypeScript 接口在转换过程中被删除,Nest 无法在运行时引用它们。
导入 DTO 时,您不能使用仅类型的导入,因为它会在运行时被删除,即记住import { CreateUserDto }而不是import type { CreateUserDto }.
管道
两个典型的用例:
- 数据转换:将输入数据转换为所需的形式(例如,从字符串到整数)
- 评估输入数据:评估输入数据,如果有效,则简单地通过它;否则抛出异常
ValidationPipe
过滤不应接收的属性
在这种情况下,我们可以将可接受的属性列入白名单,并且白名单中未包含的任何属性都会自动从生成的对象中删除。 例如,如果我们的处理程序期望email和password属性,但请求还包含一个age属性,则可以自动从生成的 DTO 中删除该属性。要启用此类行为,请设置whitelist为true.
当设置为 true 时,这将自动删除非白名单属性(那些在验证类中没有任何装饰器的属性)。
或者,您可以在存在非白名单属性时停止处理请求,并向用户返回错误响应。
自动转换负载为指定类型
- 转换为根据其 DTO 类类型
- 原始类型的转换
显示转换
@Get(':id')
findOne(
@Param('id', ParseIntPipe) id: number,
@Query('sort', ParseBoolPipe) sort: boolean,
) {
console.log(typeof id === 'number'); // true
console.log(typeof sort === 'boolean'); // true
return 'This action returns a user';
}
重定向
- 使用@Redirect()装饰器
@Get()
@Redirect('https://nestjs.com', 301)
动态变化的重定向可以使用
{ "url": string, "statusCode": number }
覆盖redriect里的路径
@Get()
@Redirect('https://nestjs.com', 301)
getDocs() {
return { url: 'https://baidu.com',statusCode:202 };
}
- 库特定的响应对象(并res.redirect()直接调用)。
@Get('demo')
findAll() {
return '11111111';
}
//重定向
@Get('ab1')
getDocs(@Res() res: Response) {
res.redirect('demo');
}
路由参数装饰器@Param
@Get(':id')
findOne(@Param() params): string {
console.log(params.id);
return `This action returns a #${params.id} cat`;
}
子域路由
@Controller({ host: 'admin.example.com' }) //要求传入请求的 HTTP 主机匹配某个特定值
export class AdminController {
@Get()
index(): string {
return 'Admin page';
}
}
@Controller({ host: ':account.example.com' }) //主机参数`@HostParam()`
export class AccountController {
@Get()
getInfo(@HostParam('account') account: string) {
return account;
}
}