为什么使用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 版本代码更简洁,可读性更强,减少了大量手动路由判断的代码。
相关推荐
@ chen6 分钟前
Spring事务 核心知识
java·后端·spring
Amumu1213823 分钟前
Vuex介绍
前端·javascript·vue.js
We་ct24 分钟前
LeetCode 54. 螺旋矩阵:两种解法吃透顺时针遍历逻辑
前端·算法·leetcode·矩阵·typescript
2601_949480061 小时前
【无标题】
开发语言·前端·javascript
css趣多多1 小时前
Vue过滤器
前端·javascript·vue.js
一点技术1 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
理人综艺好会1 小时前
Web学习之用户认证
前端·学习
We་ct2 小时前
LeetCode 36. 有效的数独:Set实现哈希表最优解
前端·算法·leetcode·typescript·散列表
weixin_395448912 小时前
main.c_cursor_0129
前端·网络·算法
RANCE_atttackkk2 小时前
Springboot+langchain4j的RAG检索增强生成
java·开发语言·spring boot·后端·spring·ai·ai编程