跳到主要内容

第一步

在这组文章中,您将学习 Nest的 “核心基础知识”。为了让您熟悉 Nest 应用程序的基本构建模块,我们将构建一个基本的 CRUD 应用程序,其涵盖了入门级别的很多功能。

编程语言

我们爱上了 TypeScript,但是最重的是 - 我们热爱 Node.js。这就是为什么 Nest 同时兼容 TypeScript 和 纯 JavaScript 的原因。由于 Nest 利用了编程语言的最新功能,因此,要将其与原始的 JavaScript 一起使用,我们需要 Babel 编译器的协助。

我们将在提供的示例中主要使用 TypeScript,但您随时可以 将代码段切换为 纯 JavaScript 语法(只需单击每个代码片段右上角的语言切换按钮即可)。

先决条件

请确保在您的操作系统上安装了 Node.js (版本号 >= 16)。

新建项目

使用 Nest CLI 创建一个新项目非常简单。如果已经安装了 npm,您可以在操作系统终端(或命令行)中使用以下命令创建一个新的 Nest 项目:

$ npm i -g @nestjs/cli
$ nest new project-name

info Hint To create a new project with TypeScript's stricter feature set, pass the --strict flag to the nest new command.

将创建 project-name 目录、安装 node 模块和其它一些样板文件,同时还将创建 src/ 目录,并填充几个核心文件。

src
app.controller.spec.ts
app.controller.ts
app.module.ts
app.service.ts
main.ts

以下是这些核心文件的简要概述:

app.controller.ts带有单个路由的基本控制器。
app.controller.spec.ts针对控制器的单元测试。
app.module.tsT应用程序的根模块(root module)。
app.service.ts具有单一方法的基本服务(service)。 method.
main.ts应用程序的入口文件,它使用核心函数 NestFactory 来创建 Nest 应用程序的实例。

main.ts 文件中包含了一个异步函数,此函数将 引导(bootstrap) 应用程序的启动过程:

@@filename(main)

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
@@switch
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();

要创建一个 Nest 应用程序的实例,我们使用了 NestFactory 核心类。NestFactory 暴露了一些静态方法用于创建应用程序的实例。其中,create() 方法返回一个应用程序的对象,该对象实现了 INestApplication 接口。该对象还提供了一组方法,这些方法将在接下来的章节中进行介绍。在上面的 main.ts 示例中,我们仅启动了 HTTP 侦听器,该侦听器使应用程序可以侦听入栈的 HTTP 请求。

请注意,使用 Nest CLI 创建的项目会拥有一个初始的项目结构,以鼓励开发人员将每个模块保存在其专用目录中。

info Hint By default, if any error happens while creating the application your app will exit with the code 1. If you want to make it throw an error instead disable the option abortOnError (e.g., NestFactory.create(AppModule, {{ '{' }} abortOnError: false {{ '}' }})).

平台

Nest 的目标是成为一个与平台无关的框架。平台独立性使创建可重用的逻辑部分成为可能,开发人员可以在多种不同类型的应用程序中利用这些逻辑部分。 从技术上讲,一旦创建了适配器,Nest 便可以使用任何 Node HTTP 框架。 目前支持两个 HTTP 平台:expressfastify。 您可以根据您的需求选择最适合平台。

platform-expressExpress 是一个著名的、极简的、专为 node 开发的 web 框架。它久经考验、适用于生产环境的软件库,并且拥有大量的社区资源。默认情况下使用 @nestjs/platform-express 软件包。许多用户对 Express 都很满意,并且无需采取任何操作即可启用它。
platform-fastifyFastify 是一个高性能且低开销的框架,高度专注于提供最高的效率和速度。点击 这里 查看它的使用文档。

无论使用那个平台,都会将平台的 application 接口暴露出来。它们分别是 NestExpressApplicationNestFastifyApplication

当您将类型信息传递给 NestFactory.create() 方法时,如下例所示,app 对象将具有该特定平台的专用方法。但是请注意,除非 您确实需要访问底层平台的 API,否则 无需 指定平台类型。

const app = await NestFactory.create<NestExpressApplication>(AppModule);

运行应用程序

安装过程完成后,您可以在操作系统的命令提示符下运行以下命令,以启动应用程序以侦听进入的 HTTP 请求:

$ npm run start

info Hint To speed up the development process (x20 times faster builds), you can use the SWC builder by passing the -b swc flag to the start script, as follows npm run start -- -b swc.

此命令将使用 HTTP 服务器启动应用程序,以侦听 src/main.ts 文件中所定义的端口。应用程序运行后,打开浏览器并访问 http://localhost:3000/ 地址,您将看到 Hello World! 信息。

To watch for changes in your files, you can run the following command to start the application:

$ npm run start:dev

This command will watch your files, automatically recompiling and reloading the server.

Linting and formatting

CLI provides best effort to scaffold a reliable development workflow at scale. Thus, a generated Nest project comes with both a code linter and formatter preinstalled (respectively eslint and prettier).

info Hint Not sure about the role of formatters vs linters? Learn the difference here.

To ensure maximum stability and extensibility, we use the base eslint and prettier cli packages. This setup allows neat IDE integration with official extensions by design.

For headless environments where an IDE is not relevant (Continuous Integration, Git hooks, etc.) a Nest project comes with ready-to-use npm scripts.

# Lint and autofix with eslint
$ npm run lint

# Format with prettier
$ npm run format