Node.js 与 Express.js 初学者手册——服务器、路由、路由器和视图详解

Node.js 与 Express.js 初学者手册——服务器、路由、路由器和视图详解

💡 原文英文,约11100词,阅读约需41分钟。
📝

内容提要

本文介绍 Node.js 与 Express.js 入门:Node.js 是浏览器外的 JavaScript 运行环境,支持 CommonJS 与 ES 模块,并可用 http 模块创建服务器;Express.js 简化了路由、中间件和响应处理,支持 Router 分组路由、静态视图与 EJS 动态模板。

🔎

延伸解读

模块系统选择:ES 模块与 CommonJS 的取舍

Node.js 同时支持 CommonJS(.cjs)和 ES 模块(.mjs),并可通过 package.json 的 type 字段统一 .js 文件的模块类型。ES 模块是 JavaScript 的官方标准,自 2015 年纳入 ECMAScript 规范;CommonJS 则更早出现,至今仍被支持。文章示例主要使用 ES 模块,并建议将 type 设为 module。读者需注意,嵌套的 package.json 会建立独立作用域,.mjs 和 .cjs 文件始终保留各自类型,混用时需留意作用域边界。

原生 HTTP 与 Express 的差异:手动处理与声明式抽象

文章通过两个功能相同的服务器示例对比了原生 Node.js 与 Express 的写法。原生方式需要手动检查 req.method 和 req.url 来路由、用 res.writeHead 设置响应头、用 JSON.stringify 序列化数据;Express 则用 app.get 等声明式方法定义路由,res.send 自动设置响应头,res.json 自动完成 JSON 序列化。这种抽象减少了重复代码,但理解底层 HTTP 模块的工作方式仍有助于排查问题和理解框架行为。

中间件与路由处理器的区分:约定而非强制

文章指出,Express 本身并不强制区分中间件和路由处理器,所有附加到路由上的函数都是处理器,通过 next() 传递控制权。开发者通常将执行认证、校验、日志等准备工作的函数称为中间件,放在 /middlewares 目录;将生成主要响应、结束请求周期的函数称为路由处理器或控制器,放在 /controllers 目录。这种区分是为了代码组织和可读性,并非框架要求。若中间件未结束请求周期,必须调用 next(),否则客户端请求会一直挂起。

路由器的组织价值:用 mini-app 拆分大型应用

express.Router() 创建的路由器对象常被称为 mini-app,因为它拥有完整的中间件和路由系统,可挂载到主应用或其他路由器上。文章以书籍、视频、索引等不同类别的路由为例,说明路由器能将相关路由和中间件集中定义,再通过 app.use() 挂载到主应用。这种方式有助于在应用规模扩大时保持结构清晰,避免所有路由都堆积在主应用实例上。

❓

Q&A

Node.js 到底是什么?它和浏览器里的 JavaScript 有什么区别?

Node.js 不是框架也不是语言,而是一个异步、事件驱动的运行时环境,让 JavaScript 能在浏览器之外运行。它包含 V8 引擎、模块系统、操作系统 API、文件系统访问、网络服务器、内存管理工具和事件循环等组件,可用于构建服务器、CLI、脚本和全栈应用。

用原生 Node.js 创建一个 HTTP 服务器需要哪几步?

主要有三步:1. 用 http 模块的 createServer 方法创建 HTTP Server 对象实例;2. 用 server.listen() 指定服务器运行的端口和主机名;3. 通过 createServer 的 requestListener 回调(或 server.on('request', callback))定义如何响应客户端请求,例如设置状态码、响应头和响应数据。

Express.js 相比原生 Node.js 的 http 模块,简化了哪些工作?

Express.js 是一个 Web 框架,它扩展了 Node 的 HTTP 模块,内置路由和中间件等功能。相比原生写法,它简化了:路由逻辑(用 app.get()、app.post() 等声明式方法替代手动检查 req.method 和 req.url)、响应头配置(res.send() 自动设置)、JSON 格式化(res.json() 自动序列化并设置 Content-Type),从而减少重复代码。

Express 中的路由是什么?它的语法是怎样的?

Express 路由由 HTTP 方法、URL 路径和一组处理客户端请求的中间件函数组成。语法为 app.METHOD(PATH, HANDLER),其中 METHOD 是小写 HTTP 方法(如 get、post、delete),PATH 是字符串或正则表达式,HANDLER 可以是单个函数、多个函数、函数数组或数组与独立函数参数的组合。

Express 中间件有哪些分类?

Express 中间件主要分为五类:应用级(挂载在 app 实例上)、路由级(挂载在 router 实例上)、错误处理(四参数签名,需放在路由和中间件之后)、内置(如 express.static、express.json、express.urlencoded)和第三方(如 cors、morgan、helmet)。这些分类并不互斥,例如 express.json() 既是应用级也是内置中间件。

express.Router() 有什么作用?

express.Router() 方法创建一个路由器对象,用于将相关的路由和中间件分组在一起。它常被称为“迷你应用”,因为它提供完整的中间件和路由系统。你可以用 app.use() 或 router.use() 把这个路由器挂载到主 Express 应用或另一个路由器上,从而更好地组织应用,例如按索引、书籍、视频等类别分别定义路由。

🏷️

标签

➡️

继续阅读