Nest.js 是一个现代化的 Node.js 框架,它基于 Express、Fastify 等众多框架,通过 TypeScript 扩展了它们的特性。Nest.js 提供了一个模块化的结构,使用依赖注入和模块化来组织代码。
本文将介绍如何使用 TypeScript 和 Nest.js 来构建一个实际的应用程序,并介绍使用过程中遇到的一些问题以及解决方法。
安装与配置
我们先来介绍如何安装 Nest.js 和 TypeScript:
$ npm install -g @nestjs/cli $ npm install --save-dev typescript
然后我们创建一个新的 Nest.js 应用程序:
$ nest new my-app
安装完毕后,打开项目目录,可以看到如下的文件结构:
-- -------------------- ---- ------- ------ --- ------------ --- --- - --- ---------------------- - --- ----------------- - --- ------------- - --- -------------- - --- ------- --- ---- - --- --------------- - --- ------------- --- ---------- --- ------------ --- --------- --- ------------------- --- -------------
在上面的结构中,可以看到我们的应用程序有一个控制器(controller)、服务(service)、模块(module)以及它们的测试文件(test.)。
控制器
在 Nest.js 中,控制器是负责处理请求和响应的中间件。控制器通常是由路由处理程序调用的。
一个基本的控制器示例代码如下:
-- -------------------- ---- ------- ------ - ----------- --- - ---- ----------------- ------ - ---------- - ---- ---------------- ------------- ------ ----- ------------- - ------------------- -------- ----------- ----------- -- ------ ----------- ------ - ------ --------------------------- - -
@Controller
装饰器用来定义一个新的控制器。在这个例子中,我们没有提供任何路由路径。这表示我们的控制器将匹配根路径。@Get
装饰器定义了一个处理 GET
请求的方法。这个方法将返回我们服务的 hello
字符串。
服务
服务是 Nest.js 中可重用的代码块。服务可以在控制器、模块和其他服务之间共享,并使用依赖注入模式将它们组合在一起。
一个基本的服务示例代码如下:
import { Injectable } from '@nestjs/common'; @Injectable() export class AppService { getHello(): string { return 'Hello World!'; } }
@Injectable
装饰器将类注入到 Nest.js 的依赖注入容器中。在这个例子中,我们只是定义了一个返回字符串的方法。
模块
Nest.js 使用模块来组织应用程序。每个应用程序至少有一个根模块。每个模块都是由控制器、服务、管道(pipe)和其他模块组成。通过导入和将它们添加到 @Module
装饰器中来引入这些组件。
一个基本的模块示例代码如下:
-- -------------------- ---- ------- ------ - ------ - ---- ----------------- ------ - ------------- - ---- ------------------- ------ - ---------- - ---- ---------------- --------- -------- --- ------------ ---------------- ---------- ------------- -- ------ ----- --------- --
@Module
装饰器将类标记为 Nest.js 模块。在这个例子中,我们定义了模块所需的控制器和服务。
入口文件
最后一个文件是应用程序的入口文件,我们将服务启动在这里。在 main.ts
中,应该创建一个 Nest.js 应用程序实例,并使用创建的应用程序实例注册我们的主模块:
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); await app.listen(3000); } bootstrap();
在上例中,我们创建了一个 bootstrap
函数,它实例化了 Nest.js 应用程序,并注册了一个主模块,然后监听端口 3000
。
遇到的问题
在使用 Nest.js 实现项目时,我们可能会遇到许多问题,这里我们只介绍其中一些典型的问题。
使用 MongoDB
使用 MongoDB 时,我们需要安装官方的 mongoose
库来解决 Node.js 数据库的问题。
安装 mongoose
:
$ npm install --save mongoose
添加 MongoDB 配置:
-- -------------------- ---- ------- ------ - -------------- - ---- ------------------- --------- -------- - --------------------------------------------------------------- - ---------------- ----- ------------------- ----- --- -- ------------ ---------------- ---------- ------------- -- ------ ----- --------- --
创建数据模型:
-- -------------------- ---- ------- ------ - -- -------- ---- ----------- ------ ----- --------- - --- ----------------- ----- ------- ---- ------- ------ ------- --- ------ --------- --- ------- ----------------- - --- ------- ----- ------- ---- ------- ------ ------- -
把 MongoDB 连接到控制器:
-- -------------------- ---- ------- ------ - ----------- ---- ----- --- - ---- ----------------- ------ - ---- --------- - ---- --------------- ------ - ----- - ---- ----------- ------ - ----------- - ---- ------------------- ------------- ------ ----- ------------- - ------------------------------- ------- --------- ----------- -- ------ ----- ---------- -------------- - ------ ---------------------------- - ------- ----- ------------- ---- ------- ------------- ------------- - ----- ------ - --- ---------------------------- ----- -------------- ----------------- - -
使用 Passport.js
Passport.js 是一个在 Express 应用程序中进行身份验证和授权样板的标准工具。它是一组具有丰富插件、模块和策略的中间件,可用于实现常见的身份验证和授权场景。当我们需要添加用户身份验证或者授权时,Passport.js 就会派上用场。
安装 Passport.js:
$ npm install --save @nestjs/passport passport passport-local
导入你需要的连接库:
-- -------------------- ---- ------- ------ - ------ - ---- ----------------- ------ - -------------- - ---- -------------------- ------ - ----------- - ---- ----------------- --------- -------- ------------- ---------------- ------------ ----------------- ---------- -------------- -- ------ ----- ---------- --
在控制器中使用 Passport.js:
-- -------------------- ---- ------- ------ - ----------- ----- -------- --------- --------- - ---- ----------------- ------ - --------- - ---- ------------------- ------ - -------------- - ---- --------------------- ------ - ----------- - ---- ----------------- ------------------- ------ ----- -------------- - ------------------- ------------ ------------ -- -------------------------- -------------- ----- ---------------- ---- ----------- ---- - ------ -------------------------------- ----- - -
在本例中,我们使用 AuthGuard
的派生类 LocalAuthGuard
作为 HTTP 请求的守卫。
总结
Nest.js 和 TypeScript 是一个非常强大的组合,它们共同为现代 Web 应用程序提供了一个可维护、可扩展的解决方案。在这篇文章的示例中,我们介绍了如何使用 Nest.js 创建应用程序。
在实际应用中,我们往往需要更多的功能和插件来完善我们的应用程序。例如,我们可能会选择使用 MongoDB 和 Passport.js 进行身份验证。通过这篇文章中的示例,希望读者能更好地理解 Nest.js 和 TypeScript 的应用,为他们在开发过程中遇到的问题提供一些解决方案和思路。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6487cdf048841e989465a2d4