第一个应用 #
一、Hello World #
1.1 最简应用 #
创建 index.js 文件:
javascript
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('服务器运行在 http://localhost:3000');
});
运行应用:
bash
node index.js
访问 http://localhost:3000,页面显示 “Hello World!”
1.2 代码解析 #
javascript
const express = require('express');
导入Express模块。
javascript
const app = express();
创建Express应用实例。
javascript
app.get('/', (req, res) => {
res.send('Hello World!');
});
定义路由:当访问根路径 / 时,返回 “Hello World!”
javascript
app.listen(3000, () => {
console.log('服务器运行在 http://localhost:3000');
});
启动服务器,监听3000端口。
二、基本路由 #
2.1 路由结构 #
Express路由的基本结构:
javascript
app.METHOD(PATH, HANDLER)
| 部分 | 说明 |
|---|---|
| METHOD | HTTP方法(get、post、put、delete等) |
| PATH | 路由路径 |
| HANDLER | 处理函数 |
2.2 GET请求 #
javascript
app.get('/', (req, res) => {
res.send('首页');
});
app.get('/about', (req, res) => {
res.send('关于页面');
});
app.get('/contact', (req, res) => {
res.send('联系页面');
});
2.3 POST请求 #
javascript
app.use(express.json());
app.post('/users', (req, res) => {
const { name, email } = req.body;
res.json({
message: '用户创建成功',
user: { name, email }
});
});
2.4 PUT请求 #
javascript
app.put('/users/:id', (req, res) => {
const { id } = req.params;
const { name } = req.body;
res.json({
message: `用户 ${id} 更新成功`,
name
});
});
2.5 DELETE请求 #
javascript
app.delete('/users/:id', (req, res) => {
const { id } = req.params;
res.json({ message: `用户 ${id} 删除成功` });
});
2.6 多方法路由 #
javascript
app.all('/secret', (req, res, next) => {
console.log('访问secret区域');
next();
});
app.get('/secret', (req, res) => {
res.send('Secret内容');
});
三、响应方法 #
3.1 res.send() #
发送各种类型的响应:
javascript
app.get('/text', (req, res) => {
res.send('文本响应');
});
app.get('/html', (req, res) => {
res.send('<h1>HTML响应</h1>');
});
app.get('/buffer', (req, res) => {
res.send(Buffer.from('Buffer响应'));
});
3.2 res.json() #
发送JSON响应:
javascript
app.get('/json', (req, res) => {
res.json({
name: 'Express',
version: '4.18.2',
features: ['路由', '中间件', '模板引擎']
});
});
3.3 res.status() #
设置状态码:
javascript
app.get('/ok', (req, res) => {
res.status(200).send('成功');
});
app.get('/created', (req, res) => {
res.status(201).json({ message: '资源创建成功' });
});
app.get('/not-found', (req, res) => {
res.status(404).json({ error: '资源未找到' });
});
app.get('/error', (req, res) => {
res.status(500).json({ error: '服务器错误' });
});
3.4 res.redirect() #
重定向:
javascript
app.get('/old-page', (req, res) => {
res.redirect('/new-page');
});
app.get('/new-page', (req, res) => {
res.send('新页面');
});
app.get('/external', (req, res) => {
res.redirect('https://expressjs.com');
});
app.get('/permanent', (req, res) => {
res.redirect(301, '/new-location');
});
3.5 res.render() #
渲染模板:
javascript
app.set('view engine', 'ejs');
app.get('/page', (req, res) => {
res.render('index', {
title: '首页',
message: '欢迎来到Express'
});
});
3.6 res.sendFile() #
发送文件:
javascript
const path = require('path');
app.get('/download', (req, res) => {
const filePath = path.join(__dirname, 'files', 'document.pdf');
res.sendFile(filePath);
});
3.7 res.download() #
触发浏览器下载:
javascript
app.get('/download-file', (req, res) => {
const filePath = path.join(__dirname, 'files', 'report.pdf');
res.download(filePath, 'report.pdf', (err) => {
if (err) {
console.error('下载失败:', err);
}
});
});
四、路由参数 #
4.1 路径参数 #
javascript
app.get('/users/:id', (req, res) => {
const { id } = req.params;
res.json({ userId: id });
});
app.get('/posts/:postId/comments/:commentId', (req, res) => {
const { postId, commentId } = req.params;
res.json({ postId, commentId });
});
4.2 查询参数 #
javascript
app.get('/search', (req, res) => {
const { q, page, limit } = req.query;
res.json({
query: q,
page: page || 1,
limit: limit || 10
});
});
访问 /search?q=express&page=2&limit=20:
json
{
"query": "express",
"page": "2",
"limit": "20"
}
4.3 请求体 #
javascript
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.post('/login', (req, res) => {
const { username, password } = req.body;
res.json({ username, password: '***' });
});
4.4 请求头 #
javascript
app.get('/headers', (req, res) => {
res.json({
userAgent: req.headers['user-agent'],
contentType: req.headers['content-type'],
authorization: req.headers['authorization']
});
});
五、完整示例 #
5.1 用户管理API #
javascript
const express = require('express');
const app = express();
app.use(express.json());
let users = [
{ id: 1, name: '张三', email: 'zhangsan@example.com' },
{ id: 2, name: '李四', email: 'lisi@example.com' }
];
app.get('/users', (req, res) => {
res.json(users);
});
app.get('/users/:id', (req, res) => {
const user = users.find(u => u.id === parseInt(req.params.id));
if (!user) {
return res.status(404).json({ error: '用户不存在' });
}
res.json(user);
});
app.post('/users', (req, res) => {
const { name, email } = req.body;
const newUser = {
id: users.length + 1,
name,
email
};
users.push(newUser);
res.status(201).json(newUser);
});
app.put('/users/:id', (req, res) => {
const { id } = req.params;
const { name, email } = req.body;
const userIndex = users.findIndex(u => u.id === parseInt(id));
if (userIndex === -1) {
return res.status(404).json({ error: '用户不存在' });
}
users[userIndex] = { ...users[userIndex], name, email };
res.json(users[userIndex]);
});
app.delete('/users/:id', (req, res) => {
const { id } = req.params;
const userIndex = users.findIndex(u => u.id === parseInt(id));
if (userIndex === -1) {
return res.status(404).json({ error: '用户不存在' });
}
users.splice(userIndex, 1);
res.status(204).send();
});
const PORT = 3000;
app.listen(PORT, () => {
console.log(`服务器运行在 http://localhost:${PORT}`);
});
5.2 测试API #
获取所有用户:
bash
curl http://localhost:3000/users
获取单个用户:
bash
curl http://localhost:3000/users/1
创建用户:
bash
curl -X POST http://localhost:3000/users \
-H "Content-Type: application/json" \
-d '{"name":"王五","email":"wangwu@example.com"}'
更新用户:
bash
curl -X PUT http://localhost:3000/users/1 \
-H "Content-Type: application/json" \
-d '{"name":"张三更新","email":"zhangsan_new@example.com"}'
删除用户:
bash
curl -X DELETE http://localhost:3000/users/1
六、错误处理 #
6.1 基本错误处理 #
javascript
app.get('/error', (req, res) => {
throw new Error('出错了!');
});
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({
error: '服务器内部错误',
message: err.message
});
});
6.2 异步错误处理 #
javascript
app.get('/async-error', async (req, res, next) => {
try {
const data = await someAsyncOperation();
res.json(data);
} catch (error) {
next(error);
}
});
app.use((err, req, res, next) => {
res.status(500).json({ error: err.message });
});
6.3 404处理 #
javascript
app.get('/', (req, res) => {
res.send('首页');
});
app.use((req, res) => {
res.status(404).json({ error: '页面未找到' });
});
七、调试技巧 #
7.1 日志输出 #
javascript
app.use((req, res, next) => {
console.log(`${req.method} ${req.url} - ${new Date().toISOString()}`);
next();
});
7.2 使用morgan中间件 #
bash
npm install morgan
javascript
const morgan = require('morgan');
app.use(morgan('dev'));
7.3 使用debug模块 #
bash
npm install debug
javascript
const debug = require('debug')('app:server');
app.get('/', (req, res) => {
debug('访问首页');
res.send('Hello');
});
运行时设置环境变量:
bash
DEBUG=app:* node index.js
八、总结 #
第一个应用要点:
| 概念 | 说明 |
|---|---|
| 路由 | 定义URL到处理函数的映射 |
| 请求对象 | req包含请求信息 |
| 响应对象 | res用于发送响应 |
| 中间件 | 处理请求的函数链 |
| 错误处理 | 捕获和处理错误 |
下一步,让我们学习如何组织应用结构!
最后更新:2026-03-28