Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用 JavaScript 的渐进增强的能力,使用并完全支持 TypeScript (仍然允许开发者使用纯 JavaScript 进行开发),并结合了 OOP (面向对象编程)、FP (函数式编程)和 FRP (函数响应式编程)。
- 在底层,Nest 构建在强大的 HTTP 服务器框架上,例如 Express (默认),并且还可以通过配置从而使用 Fastify !
- Nest 在这些常见的 Node.js 框架 (Express/Fastify) 之上提高了一个抽象级别,但仍然向开发者直接暴露了底层框架的 API。这使得开发者可以自由地使用适用于底层平台的无数的第三方模块。
本文基于nest8演示
# 基础
# 创建项目
$ npm i -g @nestjs/cli
nest new project-name 创建一个项目
$ tree
.
├── README.md
├── nest-cli.json
├── package.json
├── src
│ ├── app.controller.spec.ts
│ ├── app.controller.ts
│ ├── app.module.ts
│ ├── app.service.ts
│ └── main.ts
├── test
│ ├── app.e2e-spec.ts
│ └── jest-e2e.json
├── tsconfig.build.json
└── tsconfig.json
2 directories, 12 files
以下是这些核心文件的简要概述:
app.controller.ts带有单个路由的基本控制器示例。app.module.ts应用程序的根模块。main.ts应用程序入口文件。它使用 NestFactory 用来创建 Nest 应用实例。
main.ts包含一个异步函数,它负责引导我们的应用程序:
import { NestFactory } from '@nestjs/core';
import { ApplicationModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(ApplicationModule);
await app.listen(3000);
}
bootstrap();
NestFactory暴露了一些静态方法用于创建应用实例create()方法返回一个实现INestApplication接口的对象, 并提供一组可用的方法
nest有两个支持开箱即用的 HTTP 平台:express和fastify。 您可以选择最适合您需求的产品
platform-expressExpress 是一个众所周知的 node.js 简约 Web 框架。 这是一个经过实战考验,适用于生产的库,拥有大量社区资源。 默认情况下使用@nestjs/platform-express包。 许多用户都可以使用Express,并且无需采取任何操作即可启用它。platform-fastifyFastify是一个高性能,低开销的框架,专注于提供最高的效率和速度。
# Nest控制器
Nest中的控制器层负责处理传入的请求, 并返回对客户端的响应。

控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常,每个控制器有多个路由,不同的路由可以执行不同的操作
通过NestCLi创建控制器:
nest -h 可以看到nest支持的命令
常用命令:
- 创建控制器:
nest g co user module - 创建服务:
nest g s user module - 创建模块:
nest g mo user module - 默认以src为根路径生成

nest g controller posts
表示创建posts的控制器,这个时候会在src目录下面生成一个posts的文件夹,这个里面就是posts的控制器,代码如下
import { Controller } from '@nestjs/common';
@Controller('posts')
export class PostsController {
}
创建好控制器后,nestjs会自动的在 app.module.ts 中引入PostsController,代码如下
// src/app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { PostsController } from './posts/posts.controller'
@Module({
imports: [],
controllers: [AppController, PostsController],
providers: [AppService],
})
export class AppModule {}
# nest配置路由请求数据
Nestjs提供了其他HTTP请求方法的装饰器
@Get()@Post()@Put()、@Delete()、@Patch()、@Options()、@Head()和@All()
在Nestjs中获取Get传值或者Post提交的数据的话我们可以使用Nestjs中的装饰器来获取。
@Request() req
@Response() 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]
示例
@Controller('posts')
export class PostsController {
constructor(private readonly postsService: PostsService) {}
@Post('create')
create(@Body() createPostDto: CreatePostDto) {
return this.postsService.create(createPostDto);
}
@Get('list')
findAll(@Query() query) {
return this.postsService.findAll(query);
}
@Get(':id')
findById(@Param('id') id: string) {
return this.postsService.findById(id);
}
@Put(':id')
update(
@Param('id') id: string,
@Body() updatePostDto: UpdatePostDto,
) {
return this.postsService.update(id, updatePostDto);
}
@Delete(':id')
remove(@Param('id') id: string) {
return this.postsService.remove(id);
}
}
注意
关于nest的return: 当请求处理程序返回 JavaScript 对象或数组时,它将自动序列化为 JSON。但是,当它返回一个字符串时,Nest 将只发送一个字符串而不是序列化它
# Nest服务
Nestjs中的服务可以是
service也可以是provider。他们都可以通过 constructor 注入依赖关系。服务本质上就是通过@Injectable()装饰器注解的类。在Nestjs中服务相当于MVC的Model

创建服务
nest g service posts
创建好服务后就可以在服务中定义对应的方法
# Nest模块
模块是具有
@Module()装饰器的类。@Module()装饰器提供了元数据,Nest 用它来组织应用程序结构

每个 Nest 应用程序至少有一个模块,即根模块。根模块是 Nest 开始安排应用程序树的地方。事实上,根模块可能是应用程序中唯一的模块,特别是当应用程序很小时,但是对于大型程序来说这是没有意义的。在大多数情况下,您将拥有多个模块,每个模块都有一组紧密相关的功能。
@module() 装饰器接受一个描述模块属性的对象:
providers由 Nest 注入器实例化的提供者,并且可以至少在整个模块中共享controllers必须创建的一组控制器imports导入模块的列表,这些模块导出了此模块中所需提供者exports由本模块提供并应在其他模块中可用的提供者的子集
// 创建模块 posts
nest g module posts
Nestjs中的共享模块
每个模块都是一个共享模块。一旦创建就能被任意模块重复使用。假设我们将在几个模块之间共享 PostsService 实例。 我们需要把 PostsService 放到 exports 数组中:
// posts.modules.ts
import { Module } from '@nestjs/common';
import { PostsController } from './posts.controller';
import { PostsService } from './posts.service';
@Module({
controllers: [PostsController],
providers: [PostsService],
exports: [PostsService] // 共享模块导出
})
export class PostsModule {}
可以使用
nest g res posts一键创建以上需要的各个模块

# 配置静态资源
NestJS中配置静态资源目录完整代码
npm i @nestjs/platform-express -S
# 配置模板引擎
npm i ejs --save
配置模板引擎
项目根目录新建views目录然后新建根目录 -> views -> default -> index.ejs
渲染页面
Nestjs中 Render装饰器可以渲染模板,使用路由匹配渲染引擎
# Cookie的使用
cookie和session的使用依赖于当前使用的平台,如:express和fastify 两种的使用方式不同,这里主要记录基于express平台的用法
cookie可以用来存储用户信息,存储购物车等信息,在实际项目中用的非常多
引入注册
接口中设置cookie 使用response
请求该接口,响应一个cookie
cookie相关配置参数
获取cookie














使用












A