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

Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用 JavaScript 的渐进增强的能力,使用并完全支持 TypeScript (仍然允许开发者使用纯 JavaScript 进行开发),并结合了 OOP (面向对象编程)、FP (函数式编程)和 FRP (函数响应式编程)。
要为应用程序中的每个路由设置前缀, 让我们使用 INestApplication 对象的 setGlobalPrefix() 方法。
import { NestFactory } from '@nestjs/core'
import { AppModule } from './app.module'
async function bootstrap() {
const app = await NestFactory.create(AppModule)
app.setGlobalPrefix('api') // 增加全局势的前缀
await app.listen(3000)
}
bootstrap()
对应用程序的引导过程影响最大的是 TypeScript 编译。但问题是,每次发生变化时,我们是否必须重新编译整个项目?一点也不。这就是为什么 webpack HMR(Hot-Module Replacement)大大减少了实例化您的应用程序所需的时间。
如果使用的是 Nest CLI,则配置过程非常简单。CLI 包装 webpack,允许使用 HotModuleReplacementPlugin。
首先,我们安装所需的软件包:
$ npm i --save-dev webpack-node-externals run-script-webpack-plugin webpack
应用经常运行在不同的 environments。 根据环境,应使用不同的配置设置。 例如,通常本地环境依赖于特定的数据库凭证,仅对本地数据库实例有效。 生产环境将使用一组单独的数据库凭据。 由于配置变量发生变化,最佳做法是在环境中使用 存储配置变量。
外部定义的环境变量通过 process.env 全局变量在 Node.js 内部是可见的。 我们可以尝试通过在每个环境中单独设置环境变量来解决多个环境的问题。 这很快就会变得笨拙,尤其是在需要轻松模拟和/或更改这些值的开发和测试环境中。
在 Node.js 应用中,通常使用 .env 文件,保存键值对,其中每个键代表一个特定值,以表示每个环境。 在不同的环境中运行应用只是交换正确的 .env 文件的问题。
跨源资源共享 (CORS) 是一种允许从另一个域请求资源的机制。 在底层,Nest 使用了 Express cors 包。 该软件包提供了多种选项,你可以根据自己的要求进行自定义。
要启用 CORS,请在 Nest 应用对象上调用 enableCors() 方法。
import { NestFactory } from '@nestjs/core'
import { AppModule } from './app.module'
async function bootstrap() {
const app = await NestFactory.create(AppModule)
app.enableCors()
await app.listen(3000)
}
bootstrap()
控制器负责处理传入的 requests 并将 responses 返回给客户端。

控制器的目的是接收应用的特定请求。 routing 机制控制哪个控制器接收哪些请求。 通常,每个控制器都有不止一条路由,不同的路由可以执行不同的操作。
现在我们要创建一个全新的user(用户模块)
nest g resource ./modules/user
提供者是 Nest 中的一个基本概念。 许多基本的 Nest 类可以被视为提供者 – 服务、存储库、工厂、助手等。 提供者的主要思想是它可以是 injected 作为依赖; 这意味着对象之间可以创建各种关系,并且对象的 "接线" 实例的功能可以在很大程度上委托给 Nest 运行时系统。

在上个章节我们为创建了user模块并自动生成了CURD代码,我们看到在生成的代码中,任何业务逻辑的处理都并非在user.controller.ts文件中,而是放在了user.service.ts文件下
模块是用 @Module() 装饰器注释的类。 @Module() 装饰器提供 Nest 用来组织应用结构的元数据。

每个应用至少有一个模块,一个 根模块。 根模块是 Nest 用来构建 应用图 的起点 - Nest 用来解析模块和提供者关系和依赖的内部数据结构。 虽然非常小的应用理论上可能只有根模块,但这不是典型的情况。 我们要强调的是,strongly 推荐使用模块作为组织组件的有效方式。 因此,对于大多数应用,最终的架构将采用多个模块,每个模块封装一组密切相关的 capabilities。
中间件是一个称为 before 路由处理程序的函数。 中间件函数可以访问 request 和 response 对象,以及应用请求-响应周期中的 next() 中间件函数。 next 中间件函数通常由名为 next 的变量表示。

默认情况下,Nest 中间件等同于 express 中间件。 官方 express 文档中的以下描述描述了中间件的功能
守卫是一个用 @Injectable() 装饰器注释的类,它实现了 CanActivate 接口。

守卫有一个 单一职责。 它们根据运行时存在的某些条件(如权限、角色、ACL 等)确定给定请求是否将由路由处理程序处理。 这通常称为 authorization。 在传统的 Express 应用中,授权(及其表亲 authentication,通常与之合作)通常由 middleware 处理。 中间件是身份验证的不错选择,因为诸如令牌验证和将属性附加到 request 对象之类的事情与特定路由上下文(及其元数据)没有紧密联系。