Express.js 是 Node.js 生态中最流行、最核心的 Web 应用开发框架,它以极简、灵活和强大的路由与中间件机制著称,极大地简化了构建服务器端应用和 API 的过程,掌握 Express,你就掌握了快速搭建高效 Web 服务的核心钥匙。

环境准备与项目初始化
-
确保 Node.js 环境:
前往 Node.js 官网下载并安装最新的 LTS 版本,安装完成后,在命令行输入node -v和npm -v验证安装成功及版本信息。 -
创建项目目录并初始化:
mkdir my-express-app cd my-express-app npm init -y
这会在
my-express-app目录下生成一个基本的package.json文件,用于管理项目依赖。 -
安装 Express:
npm install express
这会将 Express 框架及其依赖下载到项目的
node_modules文件夹,并在package.json的dependencies中记录。
创建你的第一个 Express 服务
-
编写入口文件:
在项目根目录下创建一个文件,通常命名为app.js或server.js。 -
基础服务器代码:
在app.js中输入以下代码:// 1. 导入 express 模块 const express = require('express'); // 2. 创建 Express 应用实例 const app = express(); // 3. 定义端口号 (环境变量优先,否则使用 3000) const PORT = process.env.PORT || 3000; // 4. 定义一个简单的路由 // 当用户访问根路径 '/' 时,返回 'Hello World!' app.get('/', (req, res) => { res.send('Hello World!'); }); // 5. 启动服务器监听指定端口 app.listen(PORT, () => { console.log(`服务器正在运行:http://localhost:${PORT}`); }); -
运行服务器:
在命令行中执行:node app.js
看到控制台输出
服务器正在运行:http://localhost:3000即表示启动成功,打开浏览器访问http://localhost:3000,页面上将显示 “Hello World!”。
深入理解路由 (Routing)
路由决定了应用如何响应客户端对特定端点(URI 或路径)的特定 HTTP 请求方法(GET, POST, PUT, DELETE 等)。
-
基本路由结构:

app.METHOD(PATH, HANDLER);
METHOD: HTTP 请求方法(小写),如get,post,put,delete。PATH: 服务器上的路径(字符串或正则表达式)。HANDLER: 当路由匹配时执行的函数,接收请求对象 (req) 和响应对象 (res) 作为参数。
-
示例:处理不同请求方法
// GET 请求 /users app.get('/users', (req, res) => { res.send('获取用户列表'); }); // POST 请求 /users app.post('/users', (req, res) => { res.send('创建一个新用户'); }); // GET 请求特定用户 ID /users/:id app.get('/users/:id', (req, res) => { const userId = req.params.id; // 从 URL 路径中获取 id 参数 res.send(`获取用户 ID 为 ${userId} 的信息`); }); // PUT 更新特定用户 /users/:id app.put('/users/:id', (req, res) => { const userId = req.params.id; res.send(`更新用户 ID 为 ${userId} 的信息`); }); // DELETE 删除用户 /users/:id app.delete('/users/:id', (req, res) => { const userId = req.params.id; res.send(`删除用户 ID 为 ${userId}`); });req.params: 包含路径参数的对象(如id)。req.query: 包含 URL 查询字符串解析后的对象(如?name=John)。req.body: 包含 POST/PUT 请求体中的数据(需要中间件解析,见下文)。
掌握中间件 (Middleware) 的力量
中间件是 Express 的核心概念,它们是按顺序执行的函数,可以访问请求对象 (req)、响应对象 (res) 和应用程序请求-响应循环中的下一个中间件函数 (next),中间件可以执行任何代码、修改请求和响应对象、结束请求-响应循环、调用栈中的下一个中间件。
-
应用级中间件:
使用app.use()或app.METHOD()绑定到应用实例,对所有请求或特定路径的请求生效。// 记录所有请求的日志中间件 (应用级) app.use((req, res, next) => { console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`); next(); // 必须调用 next() 将控制权传递给下一个中间件或路由 }); // 只对 /admin 路径下的请求进行身份验证检查 app.use('/admin', (req, res, next) => { if (isAuthenticated(req)) { // 假设有一个检查函数 next(); } else { res.status(401).send('未经授权'); } }); -
路由级中间件:
工作方式与应用级中间件类似,但绑定到express.Router()实例。const router = express.Router(); // 为这个特定路由添加一个中间件 router.use((req, res, next) => { console.log('路由中间件触发'); next(); }); router.get('/', (req, res) => { res.send('路由主页'); }); app.use('/special', router); // 将路由挂载到 /special 路径 -
内置中间件:
express.static: 托管静态文件(如 HTML, CSS, JS, 图片)。app.use(express.static('public')); // 提供 'public' 目录下的静态文件express.json(): 解析请求体中 Content-Type 为application/json的 JSON 数据到req.body。express.urlencoded(): 解析请求体中 Content-Type 为application/x-www-form-urlencoded的数据到req.body。// 解析 JSON 请求体 app.use(express.json()); // 解析表单提交数据 app.use(express.urlencoded({ extended: true })); // extended: true 允许解析嵌套对象注意:Express 4.16.0+ 开始将这些中间件重新包含在核心中。
-
第三方中间件:
庞大的社区提供了丰富的中间件解决常见问题:morgan: HTTP 请求日志记录器。helmet: 设置各种 HTTP 头增强安全性。cors: 处理跨域资源共享 (CORS)。cookie-parser: 解析 Cookie。passport: 身份验证中间件。
模板引擎集成 (可选,用于服务端渲染)
Express 可以轻松集成模板引擎(如 EJS, Pug(原Jade), Handlebars)来动态生成 HTML。
-
安装模板引擎 (以 EJS 为例):
npm install ejs
-
配置 Express 使用 EJS:
// 设置视图引擎为 ejs app.set('view engine', 'ejs'); // 设置视图文件的目录 (默认为项目根目录下的 'views') app.set('views', path.join(__dirname, 'views')); // 使用 path 模块确保路径正确 -
创建视图文件:
在views目录下创建index.ejs:<!DOCTYPE html> <html> <head> <title><%= title %></title> </head> <body> <h1>Welcome, <%= user.name %>!</h1> <p>Your email is: <%= user.email %></p> </body> </html>(
<%= %>用于输出转义后的变量值)。
-
渲染视图:
在路由处理程序中使用res.render():app.get('/', (req, res) => { res.render('index', { title: '首页', user: { name: '张三', email: 'zhangsan@example.com' } }); // 渲染 views/index.ejs,并传递数据对象 });
错误处理中间件
错误处理中间件需要四个参数:(err, req, res, next),它必须放在所有其他 app.use() 和路由之后。
// 定义错误处理中间件
app.use((err, req, res, next) => {
console.error(err.stack); // 记录错误堆栈到控制台
// 根据环境设置响应状态码和错误信息
res.status(err.status || 500);
res.json({
error: {
message: process.env.NODE_ENV === 'development' ? err.message : '服务器内部错误',
...(process.env.NODE_ENV === 'development' && { stack: err.stack }) // 开发环境返回堆栈
}
});
});
- 在路由或中间件中,可以调用
next(err)将错误传递给错误处理中间件。 - 区分开发环境 (
development) 和生产环境 (production) 以控制错误信息的暴露程度是安全最佳实践,通常通过环境变量NODE_ENV设置。
项目结构建议与进阶
-
组织项目:
随着项目增长,建议采用模块化结构:my-express-app/ ├── node_modules/ ├── config/ # 配置文件 ├── controllers/ # 路由处理逻辑 (业务逻辑) ├── models/ # 数据模型 (数据库交互) ├── routes/ # 路由定义 (将路径映射到控制器) ├── middlewares/ # 自定义中间件 ├── public/ # 静态文件 (express.static 托管) ├── views/ # 模板文件 (如果使用) ├── .env # 环境变量 (使用 dotenv 加载) ├── app.js # 主应用入口 └── package.json -
使用
dotenv管理环境变量:npm install dotenv
在
app.js顶部加载:require('dotenv').config(); // 读取 .env 文件中的变量到 process.env -
数据库集成:
Express 本身不包含数据库层,你需要选择并安装相应的 Node.js 数据库驱动或 ORM/ODM 库:- SQL:
pg(PostgreSQL),mysql2(MySQL),sqlite3(SQLite) - NoSQL:
mongoose(MongoDB),redis(Redis)
在models目录中定义模型和数据库交互逻辑。
- SQL:
-
API 设计与最佳实践:
- 遵循 RESTful 原则设计清晰的 API 端点。
- 使用一致的命名规范(复数资源名)。
- 返回适当的 HTTP 状态码 (
200 OK,201 Created,400 Bad Request,401 Unauthorized,404 Not Found,500 Internal Server Error)。 - 返回结构化的 JSON 响应(包含
data、error等字段)。 - 实施输入验证和清理(使用如
express-validator等库)。 - 使用 HTTPS。
- 实施速率限制(使用如
express-rate-limit)。
部署上线
- 环境准备: 确保生产服务器安装了 Node.js 和数据库。
- 代码传输: 使用 Git、FTP 或 CI/CD 工具将代码部署到服务器。
- 安装依赖: 在服务器项目目录运行
npm install --production(仅安装dependencies,不安装devDependencies)。 - 设置环境变量: 在服务器上配置
.env文件或系统环境变量(如数据库连接字符串、API 密钥)。 - 进程管理: 使用进程管理器确保应用崩溃后自动重启,并管理日志:
- 推荐:
pm2(npm install pm2 -g)pm2 start app.js --name "my-express-app" pm2 save # 保存进程列表 pm2 startup # 设置开机自启 (按提示操作)
- 其他选项:
forever,systemd。
- 推荐:
- 反向代理 (推荐): 使用 Nginx 或 Apache 作为反向代理放在 Express 应用前面,处理静态文件、SSL 终止、负载均衡等,提升性能和安全性。
- 监控与日志: 配置日志记录(文件或集中式服务)和应用监控(如 Prometheus + Grafana)。
开始你的 Express 之旅!
Express 的强大在于其简洁的 API 和可扩展的中间件架构,从简单的 “Hello World” 开始,逐步添加路由、中间件、数据库和视图,你就能构建出功能丰富的 Web 应用和 API,编写清晰、模块化的代码和遵循安全最佳实践是构建健壮应用的关键,实践是最好的老师,动手搭建你的项目吧!
你正在使用 Express 构建什么类型的应用?是 API、服务端渲染的网站,还是混合应用?在开发过程中遇到最具挑战性的问题是什么?欢迎在评论区分享你的经验和见解!
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/34030.html