1. 更简洁的 API
Express 提供了更简洁、更高级的 API,简化了路由、请求处理和响应的代码。
-
原生 Node.js:
const http = require('http'); const server = http.createServer((req, res) => { if (req.url === '/') { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello, World!'); } else { res.writeHead(404, { 'Content-Type': 'text/plain' }); res.end('Not Found'); } }); server.listen(3000); -
Express:
const express = require('express'); const app = express(); app.get('/', (req, res) => { res.send('Hello, World!'); }); app.listen(3000);
Express 的代码更简洁,易于阅读和维护。
2. 强大的路由功能
Express 提供了强大的路由功能,支持基于 HTTP 方法(GET、POST 等)和 URL 路径的路由。
-
原生 Node.js: 需要手动解析 URL 和方法,逻辑复杂。
if (req.url === '/users' && req.method === 'GET') { // 处理 GET /users } -
Express: 使用直观的路由方法。
app.get('/users', (req, res) => { res.send('List of users'); });
Express 还支持动态路由和路由参数:
app.get('/users/:id', (req, res) => {
const userId = req.params.id;
res.send(`User ID: ${userId}`);
});
3. 中间件支持
Express 的中间件机制是其核心特性之一,允许开发者在请求和响应之间插入逻辑。
-
原生 Node.js: 需要手动实现中间件逻辑。
const server = http.createServer((req, res) => { // 手动实现日志中间件 console.log(`${req.method} ${req.url}`); // 处理请求 }); -
Express: 使用内置的中间件或自定义中间件。
app.use((req, res, next) => { console.log(`${req.method} ${req.url}`); next(); // 传递给下一个中间件或路由 });
Express 还提供了丰富的第三方中间件(如 body-parser、cors 等),简化了常见任务的处理。
4. 请求和响应对象的增强
Express 对原生的 req 和 res 对象进行了扩展,提供了更多实用的方法和属性。
-
原生 Node.js: 需要手动解析请求体和查询参数。
let body = ''; req.on('data', chunk => { body += chunk.toString(); }); req.on('end', () => { const data = JSON.parse(body); }); -
Express: 使用增强的
req和res对象。app.use(express.json()); // 解析 JSON 请求体 app.post('/users', (req, res) => { const userData = req.body; // 直接获取请求体 res.json(userData); });
Express 还支持直接设置响应状态码、发送 JSON 数据、重定向等:
res.status(201).json({ message: 'User created' });
5. 模板引擎支持
Express 支持多种模板引擎(如 EJS、Pug、Handlebars 等),方便渲染动态 HTML 页面。
-
原生 Node.js: 需要手动读取和渲染模板文件。
const fs = require('fs'); fs.readFile('views/index.html', 'utf8', (err, data) => { res.writeHead(200, { 'Content-Type': 'text/html' }); res.end(data); }); -
Express: 使用模板引擎渲染视图。
app.set('view engine', 'ejs'); app.get('/', (req, res) => { res.render('index', { title: 'Home' }); });
6. 错误处理更便捷
Express 提供了统一的错误处理机制,方便捕获和处理错误。
-
原生 Node.js: 需要手动捕获错误并处理。
server.on('error', (err) => { console.error('Server error:', err); }); -
Express: 使用错误处理中间件。
app.use((err, req, res, next) => { console.error(err.stack); res.status(500).send('Something broke!'); });
7. 社区和生态支持
Express 拥有庞大的社区和丰富的生态系统,提供了大量第三方中间件和工具,如:
body-parser:解析请求体。cors:处理跨域请求。helmet:增强安全性。morgan:记录请求日志。
这些工具可以快速集成到 Express 应用中,减少开发时间。
8. 更好的开发体验
Express 提供了更好的开发体验,包括:
- 热重载:结合工具(如
nodemon)实现代码更改后自动重启。 - 调试工具:支持调试中间件和路由。
- 模块化:支持将路由和中间件拆分为多个模块,便于维护。
总结
与原生 Node.js 的 HTTP 模块相比,Express 的主要优势在于:
- 更简洁的 API,减少样板代码。
- 强大的路由功能,支持动态路由和参数。
- 中间件机制,方便扩展功能。
- 增强的请求和响应对象,简化数据处理。
- 支持模板引擎,方便渲染动态页面。
- 统一的错误处理机制。
- 庞大的社区和生态系统。
- 更好的开发体验。
这些特性使得 Express 成为构建 Web 应用和 API 的首选框架。