网站建设有什么形式discuz 做企业网站

当前位置: 首页 > news >正文

网站建设有什么形式,discuz 做企业网站,wordpress文章内乱码,有名的网站制Express.js 与 Nest.js对比 自从 Node.js 发布以来#xff0c;Javascript 在后端领域的使用有所增加。由于 Node.js 的使用越来越多#xff0c;每天都会有新的框架和工具发布。Express 和 Nest 是使用 Node.js 创建后端应用程序的最著名的框架之一#xff0c;在本文中…Express.js 与 Nest.js对比 自从 Node.js 发布以来Javascript 在后端领域的使用有所增加。由于 Node.js 的使用越来越多每天都会有新的框架和工具发布。Express 和 Nest 是使用 Node.js 创建后端应用程序的最著名的框架之一在本文中我们将对它们进行比较。 Express Express 是 Node.js 的简约框架。尽管它涵盖了创建服务器端应用程序的几个核心方面但由于其简单性、灵活性和性能它很流行甚至 Nest 也是构建在 Express 之上的。但是express 仍然存在一些问题在我们深入研究这些问题之前我们需要了解它们为我们提供了什么让我们不使用任何框架而仅使用 Node.js 创建一个 Web 服务器。 const http require(node:http);// Create a local server to receive data from const server http.createServer((req, res) {res.writeHead(200, { Content-Type: application/json });res.end(JSON.stringify({ message: Hello World! })); });server.listen(8000);在上面的代码中我们使用 Node.js 中内置的 HTTP 模块创建一个 Web 服务器。如果我们向http://localhost:8000发送 Web 请求将从我们的 Node.js 服务器收到一条消息 (Hello World)。 这很简单但是如果我们想创建一个包含数百条不同路由的 REST API 该怎么办然后我们必须编写一个路由匹配器并将每个路由发送到其特定的控制器。另外我们必须实现 GET、POST、PUT 等 HTTP 方法来满足 REST 标准对吗Express 所做的正是这个express 为我们处理请求/响应控制、路由、提供静态文件和中间件。这就是 Express 如此轻量和简单的美妙之处。现在让我们看看如何使用express 创建之前的应用程序。 const express require(express); const app express();app.get(/, (req, res) {res.send({ message: Hello World }); });app.listen(8000);上面的代码也做了同样的事情。但是express为我们提供了一个与请求的URL匹配的路由机制所以如果我们想使用express router创建一个cat路由它会看起来像这样。 const express require(express); const app express(); const router express.Router();router.get(/, (req, res) {res.send(Hello Cats); });router.post(/create, (req, res) {res.send(Create New Cat!); });app.use(/cats, router); app.listen(8000);这很好但是Express有什么问题呢Express 非常简约且直接为用户提供了灵活性。灵活性对于有经验的用户或复杂的场景非常有利但灵活性会导致错误和结构错误的增加。此外现在的应用程序需要大量额外的逻辑例如请求验证、授权、文档、测试、日志记录等。因此Express 只为我们提供了一些功能人们需要使用其他库或框架来解决这些需求。这就是 Nest.js 存在的原因。 Nest Nest 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架。Nest 构建在常见 Node.js 框架Express、Fastify之上。它使用渐进式 JavaScript使用 TypeScript 构建并完全支持 TypeScript但仍然允许开发人员使用纯 JavaScript 进行编码并结合了 OOP面向对象编程、FP函数式编程和 FRP函数式反应式编程的元素。 Nest 在这些常见 Node.js 框架Express/Fastify之上提供抽象并将其 API 直接公开给开发人员。这使开发人员可以自由地使用可用于底层平台的无数第三方模块。Nest 的目的是创建高度可测试、可扩展、松散耦合且易于维护的应用程序。 为了证明这一点让我们使用 Nest 重构之前的应用 import { Controller, Get, Post } from nestjs/common; Controller(cat) export class CatController {Get()getCats() {return Hello World;}Post(create)create() {return Create New Cat!;} }Nest 的路由方法与控制器配合使用控制器可以组织路由并使路由更清晰、更易于管理。Nest 有一个默认的错误处理程序和其他内置实用程序可帮助我们快速入门。当然可以用express手动实现它们但不需要重新发明轮子。所有这些便利设置使 Nest 成为初学者的更好选择因为这些核心实用程序对于初学者来说可能很难理解。 对比 现在我们了解了这些框架的基础知识让我们深入了解、对比一下Express和Next。

  1. 架构 在 Express 中没有架构标准。这在许多大型项目或微服务应用程序中成为一个问题因为它们需要强大而灵活的架构来保持应用程序的可维护性。 另一方面Nest 最强大的一面是架构因为 Nest 有许多实用程序来提供灵活、干净且​​强大的架构。Nest-Modules 就是一个很好的例子。Nest-Module 用于组织应用程序结构并帮助开发人员管理模块的依赖关系。 Nest 还非常适合应用 N 层架构旨在将应用程序划分为逻辑层。层是一种分离职责和管理依赖关系以实现关注点分离 (SoC) 原则的方法。为了实现这一目标Nest 建议调用控制器内的服务层并在这些服务层内执行所有业务逻辑。对于服务层调用另一个层称为存储库层该层负责数据访问。因此我们将我们的关注点分为三层。分离这些层可以为软件提供可重用性和可维护性。它还使我们的应用程序易于测试 我们创建的cat路由它可能看起来像这样 CatController - CatService - CatRepository 因此每当我们需要在任何控制器中调用 CatService 的方法时我们只需创建 CatService 的实例并调用该方法或者我们可以通过将 CatService 实例作为 CatController 构造函数的参数传递来使用现有的 CatService 实例即Nest还有一个概念叫做依赖注入。
  2. 依赖注入 依赖注入是一种设计模式其中一个对象接收它所依赖的其他对象。依赖注入是控制反转的一种形式旨在分离构造对象和使用对象的关注点从而导致松散耦合的程序。 在 Nest 中可以通过在要注入的模块顶部添加 Injectable 装饰器来使用依赖注入。例如 import { Injectable } from nestjs/common; Injectable() export class CatService {findAll() {return Hello World;}create() {return Create New Cat!;} }import { Controller, Get, Post } from nestjs/common; import { CatService } from ./cat.service;Controller(cat) export class CatController {constructor(private readonly catService: CatService) {}Get()getCats() {return this.catService.findAll();}Post(create)create() {return this.catService.create();} }正如我们所看到的我们将 catService 实例作为参数传递给 CatController 的构造函数。这种方法使应用程序更易于维护且易于测试尤其是对于大型应用程序。这是使用 Nest 的最大优势之一。
  3. 中间件 默认情况下Nest 中间件相当于 Express 中间件。在 Express 中间件中我们只需创建另一个在控制器之前/之后运行的路由处理程序。Nest 有一个MiddlewareConsumer类它是一个辅助类。它提供了几种内置方法来管理中间件。所有这些都可以简单地以流畅的方式链接起来。MiddlewareConsumer 有一个forRoutes属性我们可以在其中简单地输入字符串或控制器的路径来注册中间件。Nest 还有一个exclude属性可以帮助我们排除路径或控制器。 Nest 还提供类似中间件的实用程序例如管道、过滤器和拦截器。它们可以被认为是中间件但它们更专注于不同的目的。例如管道主要用于验证和数据转换。另一方面中间件是在路由处理程序之前运行的处理程序并且可以访问请求对象。过滤器与中间件相反。它们在路由处理程序之后运行并操作响应对象以进行错误处理等。最后拦截器可以在调用路由处理程序之前和之后访问请求和响应对象。 Nest 还提供了一个名为 ExecutionContext 的实用程序它提供有关当前执行过程的其他详细信息例如接下来要执行的内容而 Express 中间件则缺少此信息。
  4. 自定义异常 Nest 为大多数场景提供了默认的异常类例如 NotFoundException、UnAuthorizedException 等。这可以节省我们一些时间。此外还可以像在express中一样创建自己的异常类。
  5. 验证 请求验证在很多方面都是有益的。它可以防止错误发生并向用户显示一条有意义的消息表明他们发送了错误的输入。此外它还可以防止用户发送不需要的输入从而使应用程序更加安全。 在express中我曾经在处理程序之前添加一个中间件这个中间件采用一个验证器作为参数该验证器是使用Joi工具创建的。但这非常耗时并且会导致我们的路由/处理程序声明看起来更长、更复杂并且有时候会忘记在处理程序之前添加验证器。不可能创建可在整个应用程序的所有上下文中使用的通用中间件。这是因为中间件不知道执行上下文包括将被调用的处理程序及其任何参数。
  6. 授权 授权是后端应用程序中的常见需求。某些服务可能需要基于角色的授权以防止不允许的操作。授权通常由传统 Express 应用程序中的中间件处理通常看起来像这样。 router.get(/create, authorize(Role.Admin), create);Nest 的授权方式类似但 Nest 通过其Guards概念提供了一些便利。守卫确定给定的请求是否将由路由处理程序处理。防护可以是控制器范围、方法范围或全局范围这在实现中提供了易用性也有助于保持代码干燥和声明性。此外执行上下文可用于构建通用防护这使得防护比传统中间件更强大。 Post() Roles(admin) async create(Body() createCatDto: CreateCatDto) { this.catsService.create(createCatDto); }7. 数据库 在express中我们通常使用 ORM对象关系映射器或ODM对象文档映射器如Sequelize或Mongoose 来处理数据库操作。Nest 没有什么不同但 Nest 具有内置的 ORM-ODM 工具这些工具提供模型/存储库注入、可测试性和动态配置以便访问我们选择的数据库我认为Nest 的架构使使用数据库变得更容易 8.API文档 迄今为止在 Nest.js 中记录 API 是最简单的。Nest 提供了一个 swagger 模块可以自动为 API 端点创建文档。此外还可以使用如下装饰器定义请求/响应模式。 ApiBody({ type: CreateCatDto })ApiCreatedResponse({ type: CreateCatResponseDto })create(Body() createSampleDto: CreateCatDto) : CreateCatResponseDto{// …}9. 性能 Nest 允许使用 Fastify 适配器它比 Express 适配器快两倍如果不使用 Fastify 适配器Nest 将无法击败 Express。我们知道 Nest 提供了这两个适配器的抽象以在它们之间进行切换但这在每种情况下都是不可能的因为在某些情况下这两个适配器的行为本质上不同。例如fastify 适配器不支持嵌套路由因此应该使用 Express 适配器来实现这一点。
  7. 测试 Nest 最强大的架构优势也在这里获胜。正如我们之前讨论的那样Nest 使用模块并将它们与依赖项注入结合起来这允许将任何依赖项注入到任何模块因此我们可以注入测试服务而无需实例化它并且它可以节省大量时间和精力特别是对于较大的模块和服务。