news 2026/8/29 18:42:03

Node系列 · Express:基本使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Node系列 · Express:基本使用

Node系列 · Express:基本使用

Express 是 Node 生态最老牌、最流行的 Web 框架——Koa 是同一作者(TJ)后续更轻量的作品,Fastify / NestJS 是更新的高性能替代。本章从零起步搭建一个 Express 服务,理解它的核心约定。

一、Express 与同类框架对比

框架风格性能生态何时选
Express中间件链式回调一般最大老项目 / 通用
Koa2async/await 中间件略好中等现代项目
Fastify插件式最快增长中性能敏感
NestJS装饰器 + DI一般企业级 / 团队

Express 不一定是"最好"的,但学习曲线最低、文档最全、第三方中间件最多——新项目入门首选。

二、安装与最小服务

mkdirmy-app&&cdmy-appnpminit-ynpminstallexpress
const express = require('express'); const app = express(); app.get('/', (req, res) => { res.send('Hello World'); }); app.listen(3000, () => { console.log('服务运行在 http://localhost:3000'); });
$nodeapp.js 服务运行在 http://localhost:3000

三、官方资源

资源地址
英文官网expressjs.com
中文官网expressjs.com.cn
GitHubexpressjs/express

四、REST 风格路由

Express 推荐按 RESTful 风格设计路由——HTTP 方法 + URL 表达"对资源的操作":

方法路径含义
GET/users用户列表
GET/users/:id单个用户详情
POST/users创建用户
PUT/users/:id整体更新用户
PATCH/users/:id部分更新用户
DELETE/users/:id删除用户
app.get('/users', listUsers); app.get('/users/:id', getUser); app.post('/users', createUser); app.put('/users/:id', updateUser); app.patch('/users/:id', partialUpdateUser); app.delete('/users/:id', deleteUser);

五、与原生 http 模块的关系

Express 是http模块的封装,底层完全一样:

Express app.get ...

Express 框架

http.createServer

net.Socket

TCP/IP

每一段app.get(path, handler)内部:

  1. 注册到 Express 的路由表
  2. http 服务收到请求后匹配 path
  3. 匹配到时调用 handler
  4. handler 里通过res.send()/res.json()返回响应

Express 的价值不是性能,而是抽象掉 HTTP 协议解析——让你专注业务逻辑。

六、第一个完整服务

const express = require('express'); const app = express(); // JSON body 解析(Content-Type: application/json) app.use(express.json()); // 模拟数据库 const users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, ]; // 路由 app.get('/api/users', (req, res) => { res.json({ users }); }); app.get('/api/users/:id', (req, res) => { const user = users.find((u) => u.id === Number(req.params.id)); if (!user) { return res.status(404).json({ error: 'User not found' }); } res.json(user); }); app.post('/api/users', (req, res) => { const newUser = { id: users.length + 1, ...req.body }; users.push(newUser); res.status(201).json(newUser); }); app.listen(3000, () => { console.log('http://localhost:3000'); });

测试:

$curlhttp://localhost:3000/api/users{"users":[{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]}$curl-XPOST-H"Content-Type: application/json"\-d'{"name":"Carol"}'http://localhost:3000/api/users{"id":3,"name":"Carol"}

七、最佳实践

场景推荐
项目起步npm init+npm install express
路由设计REST 风格(GET / POST / PUT / DELETE)
JSON 接口app.use(express.json())解析请求体
文件上传multer中间件
跨域cors中间件(详见 跨域 CORS)
路由拆分express.Router()(详见 路由)
自动重启nodemon(见 nodemon 章节)

八、小结

  • Express 是 Node 老牌 Web 框架;最小服务 5 行代码
  • 推荐 REST 风格:HTTP 方法 + URL 表达资源操作
  • Express 是http模块的封装,底层完全一致
  • 项目结构:app.js入口 + 路由模块 + 中间件
  • 中文文档:expressjs.com.cn
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 18:40:22

物理仿真击剑对抗:盲评大模型推理能力的新方法

这个项目的玩法一句话就能说清:两个 LLM 分别控制一个剑客,在物理仿真场景里互相对战,人类观众看不到模型身份,只凭战斗过程和双方给出的决策理由,盲投票判断谁“更会推理”。它看起来像娱乐向的 AI 对战游戏&#xff…

作者头像 李华
网站建设 2026/8/29 18:39:14

松下轨道车辆用镍氢电池系统解析:技术选型背后的安全与寿命逻辑

最近看到松下能源发布铁路车辆用新型镍氢电池系统的消息,我的第一反应是愣了一下——这个时间点,所有新闻都在讲锂电池、固态电池,松下却把镍氢电池重新搬上台面,而且用在轨道交通上。冷静下来想想,这件事其实很有看头…

作者头像 李华
网站建设 2026/8/29 18:38:51

从React到Elm:重新理解前端状态管理与类型安全

我注意到你提供的是关于 “An Elm Primer for React Developers” 的 PDF 标题,但项目正文和搜索材料为空,以下我会基于该标题的核心主题——向 React 开发者介绍 Elm 语言——撰写一篇技术博文。文章会从 React 开发者的真实痛点切入,解释 E…

作者头像 李华
网站建设 2026/8/29 18:38:24

拓扑排序与动态规划:解决DAG路径计数问题的核心算法

1. 问题引入:从“大鱼吃小鱼”到“食物链计数” 最近在刷一些算法题,遇到了一个挺有意思的题目,叫做“最大食物链计数”。题目背景很生活化,就是生态学里的食物链:一种生物吃另一种生物,形成一条链。题目要…

作者头像 李华
网站建设 2026/8/29 18:38:20

STM32U375 Standby模式进不去?低功耗排查指南与解决步骤

把 “standby on stm32u375 not reaching low power state” 这个问题摆到桌面上,做过低功耗开发的人都知道这是什么滋味:代码确实调用了HAL_PWR_EnterSTANDBYMode(),理论上这颗芯片应该掉到几百纳安,结果电流表上还挂着好几毫安&…

作者头像 李华
网站建设 2026/8/29 18:37:50

C++模板编程:从泛型基础到可变参数模板实战指南

1. 从“重复造轮子”到“一劳永逸”:为什么我们需要模板如果你写过一段时间的C,尤其是写过一些需要处理多种数据类型的通用功能(比如一个能比较任意类型大小的max函数,或者一个能存储任意类型数据的链表),你…

作者头像 李华