为什么使用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 版本代码更简洁,可读性更强,减少了大量手动路由判断的代码。
相关推荐
Pedantic6 小时前
SwiftUI 手势层级(Gesture Hierarchy)详解
前端
飘尘6 小时前
前端转型全栈(Java后端)的快速上手指引
前端·后端·全栈
一颗烂土豆6 小时前
Meshopt 压缩深度解析,为什么它比 Draco 更快
前端·javascript·webgl
浏览器工程师7 小时前
AI Agent 接浏览器任务,先别让它一路点到底
前端·后端
行者全栈架构师7 小时前
Maven dependency:tree 的 8 个高级用法
java·后端
雨季mo浅忆7 小时前
VSCode自动格式化三要素
前端
Chenyiax7 小时前
从一次请求看懂 OkHttp:架构、调度与连接管理
后端
爱勇宝8 小时前
深扒 Anthropic 1680 位工程师简历:应届生几乎没机会,AI 公司最缺的不是博士
前端·后端·程序员
AskHarries9 小时前
工具失败时怎么办:重试、回滚、人工确认和风险提示
后端·程序员