讲师中心 微信公众号
AI工具推荐 视频效率加速

Express NextJS NestJS 初学者速查表

落静小哥_4521

落静小哥_4521

发布时间:2024-09-30 08:42:52

|

1272人浏览过

|

来源于dev.to

转载

简介

我最近必须学习 nestjs,为一个用它编写的项目做好准备。请注意,不是 nextjs,而是 nestjs。和你们中的一些人一样,我听说过它,但从未有机会实际使用它。它已经流行了一段时间了,今年早些时候赶上了 nodejs 后端开发的鼻祖——expressjs。这是他们的官方推文:

Express <> NextJS <> NestJS 初学者速查表

话虽如此,npm 的纯下载量存在很大差异 — Express 在撰写本文时每周下载量高达 32,397,019 次,Next 为 7,263,688 次,Nest 为 3,579,676 次。现在Nest确实在某种程度上与Express有联系,这将在文章中提到。

我想强调的是,NestJS 拥有出色的文档(充满了猫作为奖励,但仅限于桌面......),它提供了足够的信息来帮助您入门并解释其所有基本和高级内容用例。永远是一个很好的起点!

如果你像我一样,在学习了N种框架和语言之后,学习新框架和语言的最简单方法就是将其与你所知道的东西进行比较和匹配。因此,我认为 NestJS 和更流行/传统/成熟的 JS 框架之间的比较可能有助于理解一些概念。

语境

<script id="gist-ltag" src="https://gist.github.com/KIvanow/8a39a804486674a15ef15555a4322895.js"></script>
  • Express.js 非常适合轻量级、灵活的 API 或限制最少的小型项目。

  • Next.js 非常适合基于 React 的应用,其中 SEO 和服务器端渲染至关重要。

  • NestJS 擅长大规模企业级应用程序,重点关注模块化和可维护性。它也是迄今为止最有主见的。其中很多意见都来自一些更有经验的 (避免说老开发人员) 熟悉的其他语言 - 控制反转、依赖注入 - Java + Spring、.NET Core、Angular(主要灵感来自 NestJS)、PHP + Laravel 或 Symfony 等

让我们从一些基本的简单示例开始,然后逐步进行。

启动一个简单的服务器

<script id="gist-ltag" src="https://gist.github.com/KIvanow/a28ba2cae5866f59cce93f19615457e5.js"></script>
<script id="gist-ltag" src="https://gist.github.com/KIvanow/38414c5b6607023cc8d90c02a7460c1a.js"></script>

最后是 NextJS -> next dev

在 NestJS 中,通过使用 NestFactory 创建应用程序并指定主应用程序模块来引导服务器。以 AppModule 为核心,结构更加有条理。

ExpressJS 更简单,通过调用express()直接创建服务器。

Next.js 不需要手动设置服务器,除非您使用自定义服务器 - 它的内置服务器会处理幕后的所有事情。

2. 处理路由

您的大部分工作都在其中。

<script id="gist-ltag" src="https://gist.github.com/KIvanow/0272e2a4d0204bf1e64425304094b5bc.js"></script>
<script id="gist-ltag" src="https://gist.github.com/KIvanow/bf90d866dd11850f7c0750a3b5512074.js"></script>
<script id="gist-ltag" src="https://gist.github.com/KIvanow/774e567126e8040c87c594c7607de0a7.js"></script>

NestJS 使用 @Controller 和 @Get 装饰器将路由映射到控制器方法,通过模块化路由提供更多结构。习惯 NestJS 的装饰器和注释。它们是该语言的关键部分(例如与 Java + Spring 相同)。

ExpressJS 允许您使用 app.get() 自由定义路由,这提供了灵活性,但内置结构较少。

在 Next.js 中,路由是基于文件的,pages 目录中的文件名会自动映射到路由,这让您变得简单,但对路由定义的控制较少。

3. 处理查询参数

<script id="gist-ltag" src="https://gist.github.com/KIvanow/f3c7cab69a06fb7806f57cb99aabc0b2.js"></script>
<script id="gist-ltag" src="https://gist.github.com/KIvanow/397c8d35ef8bdcb5010810c175dbedf2.js"></script>
<script id="gist-ltag" src="https://gist.github.com/KIvanow/3af7b82a3bc3835e692e8182d0e99436.js"></script>

ExpressJS 依赖 req.query 来访问查询参数,提供了一种更加手动的方法。

Next.js 使用 useRouter 钩子来检索组件内的查询参数,从而与 React 约定更加一致。

NestJS 使用 @Query() 装饰器轻松提取控制器方法中的查询参数。

4. 处理路径参数

<script id="gist-ltag" src="https://gist.github.com/KIvanow/5ab9033fcbec83ea02bb9b85fff9a73d.js"></script>
<script id="gist-ltag" src="https://gist.github.com/KIvanow/4d1edbbbef93bba95960c6e23361dd54.js"></script>
<script id="gist-ltag" src="https://gist.github.com/KIvanow/0eaf543c4fe1ce6d2f08b27ea8b4dbb6.js"></script>

在 ExpressJS 中,路径参数是使用 :paramName 在路由本身中定义的。例如,app.get('/users/:id') 将 id 定义为动态参数。然后,您可以使用 req.params.paramName 访问此参数,该参数很灵活,但结构不如 NestJS。

在 Next.js 中,路径参数是使用 动态路由 处理的。要在 Next.js 中定义路径参数,请在 Pages 目录中创建一个带方括号的文件,例如 [id].js。文件名 ([id]) 用于创建动态匹配作为 id 传递的任何值的路由。然后,您可以使用 useRouter() 挂钩来访问组件内的参数。这种方法简单且对 React 友好,但不如 NestJS 方法那么明确。

在 NestJS 中,路径参数是使用 @param() 装饰器结合 @Get(':id') 装饰器来定义的。 @Get(':id')指定id是动态的,@param('id')用于提取控制器中的参数。 NestJS 中的路径参数是显式定义的,并与控制器方法相关联,使其高度结构化。

5. 添加中间件

了解了很多基础知识后,让我们开始一些更有趣的事情。中间件用于多种用途——检查权限、验证、日志记录等等。虽然在 Express 中它只是中间件,但在 NestJS 中,有几个不同的东西正在做类似的工作。

<script id="gist-ltag" src="https://gist.github.com/KIvanow/09bb494f111960e54b9c4e8f5b0429d5.js"></script>
<script id="gist-ltag" src="https://gist.github.com/KIvanow/ef6748800a9f5e21143d61756b443073.js"></script>

Next.js 没有像 NestJS 和 Express 那样的内置中间件支持。中间件功能通常在自定义服务器(如 Express)中实现。

请注意 Express 和 Nest 的结构非常相似。是时候分享 Nest 实际上在幕后使用 Express 或 Fastify 的事实了。

GitHub & Developer Data
GitHub & Developer Data

面向AI代理的GitHub及开发者数据——仓库元数据(星标、语言、许可证)、仓库审计与风险评分、用户资料、最新发布和gist内容...

下载

在 ExpressJS 中,中间件更加灵活,可以使用 app.use() 全局应用,也可以通过将中间件函数作为路由定义中的第二个参数传递来将范围限制到特定路由。 Express 更加不固执,让开发人员可以自由地构建中间件。

NestJS 提供了一种高度结构化和模块化的方式来处理中间件,将其集成到其依赖注入系统中,这对于需要可重用中间件逻辑的大型应用程序来说是理想的选择。

6. 依赖注入

与其他两个框架相比,这是 NestJS 中最固执己见的部分之一。

<script id="gist-ltag" src="https://gist.github.com/KIvanow/ce5ea49fa7446921e03ea8feaecf3b1c.js"></script>
<script id="gist-ltag" src="https://gist.github.com/KIvanow/c4a3846ed8f38c48e48def9d450c983c.js"></script>
<script id="gist-ltag" src="https://gist.github.com/KIvanow/f073aaafb53ed93b629262236f84db58.js"></script>

NestJS 严重依赖依赖注入 (DI),这是其架构的核心部分。您可以使用 @Injectable 装饰器注入服务。同时,Express 和 Next 都不支持开箱即用,因此通常情况下,您需要手动传递依赖项。

依赖注入是NestJS使用的核心设计模式之一。它通过以下方式融入其中:

  1. NestJS 使用 IoC 容器来管理依赖项生命周期,在需要时自动注入依赖项。这将创建和管理依赖项的责任从开发人员转移到了框架,简化了设置,并减少了连接服务、控制器和其他组件时的手动工作。

  2. 通过 DI,NestJS 在整个应用程序中强制执行一致的模式,确保所有依赖项都以相同的方式处理。这使得架构具有可预测性并减少混乱。

  3. 随着应用程序的增长,NestJS 中的 IoC 容器可以有效地处理越来越多的依赖项,确保平滑扩展。这可以防止手动管理复杂服务依赖项带来的混乱,使代码库更易于维护并减少出错的可能性。

  4. NestJS 中的 DI 通过分离服务及其依赖项来鼓励松散耦合,从而更容易修改或替换系统的某些部分,而不会破坏整个应用程序。这种解耦还可以更轻松地测试和模拟服务。

虽然所有这些要点对于大型应用程序来说都非常有用,但 DI 模式对于小型项目来说可能会很复杂,尤其是在您不习惯的情况下。

7. 控制反转

<script id="gist-ltag" src="https://gist.github.com/KIvanow/33793aed873f11ade330a3ca22e86c89.js"></script>
<script id="gist-ltag" src="https://gist.github.com/KIvanow/c00f23b260ffdad19915ad09ec174259.js"></script>
<script id="gist-ltag" src="https://gist.github.com/KIvanow/3e76637309de223c17eb406f418c46b3.js"></script>

NestJS 使用 IoC 容器自动进行依赖项管理,而 ExpressJS 和 Next.js 则依赖于依赖项的手动实例化。请注意我们只是说 userService 或 userRepository 属于特定类型。之后,所有额外的处理都由 NestJS 负责。我们不必考虑何时生成这些组件、它们有多少实例,或者其他任何事情。当然,我们确实可以控制这些。

这使得最后一个示例更具可扩展性、模块化且更易于测试。

这种方法的明显缺点是——学习曲线增加。对于所有固执己见的框架都是如此,而且对于小型应用程序来说,这可能感觉有点矫枉过正。

8 — 权限管理

<script id="gist-ltag" src="https://gist.github.com/KIvanow/b1d895a29c9e4db0d4c065df7f228655.js"></script>
<script id="gist-ltag" src="https://gist.github.com/KIvanow/3a98d374d5f9ed08c96efeba6fff66fd.js"></script>

当我们谈论 NestJS 和其他两个框架之间的差异时,我认为是时候提及 Guards 了。 Guards 是管理权限的核心功能。它们提供了一种干净、可扩展的方式来根据用户角色或任何其他条件控制访问。防护具有高度可重用性,可以应用于特定路由或跨应用程序全局。

Express 和 Next 依赖于中间件或对会话进行手动检查,这使得小型应用程序变得更容易,但随着应用程序规模的扩大,其复杂性也会增加。

9— 数据转换 — 管道

<script id="gist-ltag" src="https://gist.github.com/KIvanow/52490d422eef6544d7121aad40948b2e.js"></script>

与 Guards 的工作方式类似,管道是 NestJS 的特定功能。在这个示例中,他们的主要目标是在将数据传递到控制器之前操纵或转换数据。

虽然可以通过中间件在 ExpressJS 和 NextJS 中实现相同的效果,但使用 Pipes 可以提供更好的错误处理和更轻松的大规模维护。

更不用说您可以自由地创建自己的自定义管道。

10 — 数据验证 — 管道 pt.2

<script id="gist-ltag" src="https://gist.github.com/KIvanow/288cb0fd3a6cd06b81261a88cda7a38a.js"></script>
<script id="gist-ltag" src="https://gist.github.com/KIvanow/200083f17240f08843871059021f6079.js"></script>
<script id="gist-ltag" src="https://gist.github.com/KIvanow/f6154e2566141452055576d679d55120.js"></script>

请注意,虽然注释/装饰器一开始可能很奇怪,但取决于您来自哪里,代码越大,有些东西实际上更容易维护和阅读。个人观点,虽然 NestJS 中的示例长了几行,但每行都短得多并且更容易理解。

此外,它再次强调了如何使用 NestJS 使事物更易于大规模维护。

您可以查看 NestJS 的官方文档以查看此示例的更长版本以及附加说明。它涉及的解释比我在本文中的目标要长,所以我只是链接它。

感谢您坚持到最后!我的目标是在这些最受认可的框架和 NestJS 之间举几个例子。这是我将在 NestJS 上撰写的一个简短系列的第一篇文章,并尝试将其概念与更常见的框架联系起来,以此来说明并使其更容易记住和理解。

如果您已经看到这里,我谢谢您,希望它对您有用!这是一张很酷的猫图片作为感谢!

Express <> NextJS <> NestJS 初学者速查表

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
PHP Symfony框架
PHP Symfony框架

本专题专注于PHP主流框架Symfony的学习与应用,系统讲解路由与控制器、依赖注入、ORM数据操作、模板引擎、表单与验证、安全认证及API开发等核心内容。通过企业管理系统、内容管理平台与电商后台等实战案例,帮助学员全面掌握Symfony在企业级应用开发中的实践技能。

5977

2025.09.11

laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

877

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

855

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2508

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

4601

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

6690

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

4416

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

8269

2025.08.05

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
快速入门Node.JS全套完整版
快速入门Node.JS全套完整版

共83课时 | 13.6万人学习

nodejs开发基础教程
nodejs开发基础教程

共15课时 | 4.9万人学习

JavaScript设计模式视频教程
JavaScript设计模式视频教程

共28课时 | 6.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn