第一个应用 #

一、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