为什么使用express框架

在初学nodejs做API服务器时,我不了解为什么要用express框架的问题,今天想通过这个文章讲清楚express能帮我们省多少事情。

以下是用原生的nodejs,http模块来写一个能提供两个GET接口的服务器。

js 复制代码
// server.js  ------  零依赖版
const http = require('http');

const PORT = 3001;
const HOST = 'localhost';

// 在 router 函数中添加新的路由处理
function router(req, res) {
    // 处理浏览器 favicon 请求,直接返回空
    if (req.url === '/favicon.ico') {
        res.writeHead(204);
        res.end();
        return;
    }

    // 处理 /api/list (保持原有逻辑)
    if (req.method === 'GET' && req.url === '/api/list') {

    // 1. CORS 响应头(等价于 cors())
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE,OPTIONS');
    res.setHeader('Access-Control-Allow-Headers', 'Content-Type');

    // 2. 预检 OPTIONS 直接返回 200
    if (req.method === 'OPTIONS') {
        res.writeHead(200);
        res.end();
        return;
    }

    // 3. 返回 JSON
    res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
    res.end(JSON.stringify({ code: 0, data: ['a', 'b', 'c'] }));
    return;

    }

    // 新增:处理 /goaldata 路径
    if (req.method === 'GET' && req.url === '/goaldata') {
        // 1. CORS 响应头
        res.setHeader('Access-Control-Allow-Origin', '*');
        res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE,OPTIONS');
        res.setHeader('Access-Control-Allow-Headers', 'Content-Type');

        try {
            // 2. 读取 data.json 文件
            const fs = require('fs');
            const path = require('path');
            const dataFilePath = path.join(__dirname, '../data.json');
            
            // 3. 检查文件是否存在
            if (fs.existsSync(dataFilePath)) {
                const data = fs.readFileSync(dataFilePath, 'utf8');
                res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
                res.end(data);
            } else {
                // 文件不存在时返回空数组
                res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
                res.end(JSON.stringify([]));
            }
        } catch (error) {
            // 错误处理
            res.writeHead(500, { 'Content-Type': 'application/json; charset=utf-8' });
            res.end(JSON.stringify({ error: '服务器内部错误' }));
        }
        return;
    }

    // 其它路径 404
    res.writeHead(404, { 'Content-Type': 'text/plain' });
    res.end('Not Found');
}

const server = http.createServer(router);

server.listen(PORT, HOST, () => {
    console.log(`API ready on http://${HOST}:${PORT}/goaldata`);
});

以下是采取express框架后的代码:

js 复制代码
// server.js - Express 版本
const express = require('express');
const fs = require('fs');
const path = require('path');

const app = express();
const PORT = 3001;
const HOST = 'localhost';

// CORS 中间件
app.use((req, res, next) => {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE,OPTIONS');
    res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
    if (req.method === 'OPTIONS') {
        return res.sendStatus(200);
    }
    next();
});

// 处理 /goaldata 路由
app.get('/goaldata', (req, res) => {
    try {
        const dataFilePath = path.join(__dirname, '../data.json');
        
        if (fs.existsSync(dataFilePath)) {
            const data = fs.readFileSync(dataFilePath, 'utf8');
            res.setHeader('Content-Type', 'application/json; charset=utf-8');
            res.send(data);
        } else {
            res.setHeader('Content-Type', 'application/json; charset=utf-8');
            res.send(JSON.stringify([]));
        }
    } catch (error) {
        res.status(500).json({ error: '服务器内部错误' });
    }
});

// 处理 /api/list 路由
app.get('/api/list', (req, res) => {
    res.json({ code: 0, data: ['a', 'b', 'c'] });
});

// 启动服务器
app.listen(PORT, HOST, () => {
    console.log(`API ready on http://${HOST}:${PORT}/goaldata`);
});

下面来梳理一下区别: 主要差异点

  1. 框架引入: 使用 express 替代原生 http 模块
    通过 app = express() 创建应用实例
  2. 路由处理: 使用 app.get() 方法直接定义路由
    不需要手动解析 req.url 和 req.method
  3. 中间件机制: 使用 app.use() 统一处理 CORS
    通过 next() 传递控制权
  4. 响应处理: 使用 res.json()、res.send() 等方法简化响应
    自动设置 Content-Type 头部
  5. 错误处理: 使用 res.status().json() 简化状态码和响应体设置
    Express 版本代码更简洁,可读性更强,减少了大量手动路由判断的代码。
相关推荐
拔剑纵狂歌12 分钟前
ClickHouse system.query_log 字段详解与排障实践
后端·clickhouse·1024程序员节
再吃一根胡萝卜22 分钟前
把本地 RAG 问答做"准":多轮指代消解 + 云端语义向量 + TXT 章节切分
后端
hzxpaipai41 分钟前
杭州企业官网怎么建设?从策划到上线的5步建站方法
运维·服务器·前端·网络
怕浪猫1 小时前
2026年金九银十,我面了22个前端
前端·javascript·面试
怕浪猫1 小时前
2026年9月面18个后端
后端·面试·github
IT_陈寒1 小时前
Vue 这个响应式陷阱,我的头发都掉没了
前端·人工智能·后端
谁在黄金彼岸1 小时前
trae的gitee mcp莫名错误
后端
前端的日常1 小时前
一个人+AI做情侣食谱小程序,30天纯赚
前端·javascript·后端
再吃一根胡萝卜1 小时前
给 RAG 问答加上「多轮指代消解」:让"他 / 这个"不再翻车
后端
庄园特聘拆椅狂魔2 小时前
Java 后端转全栈的第一课:从前端项目搭建到技术选
java·开发语言·前端