搭建Node.js服务器

1.基础HTTP服务器:
  • 添加了路由处理
  • 添加了404错误处理
  • 添加了服务器错误监听
2.静态资源服务器:
  • 使用异步文件操作
  • 支持目录自动索引(默认加载 index.html)
  • 自动检测文件类型并设置正确Content-Type
  • 更完善的错误处理
3.处理GET请求参数
  • 提供了一个HTML表单用于测试
  • 使用url模块解析URL和查询参数
  • 清晰展示接收到的GET参数
4.处理POST请求参数:
  • 提供了一个HTML表单用于测试
  • 使用流的方式处理POST数据
  • 正确解析表单数据
  • 清晰展示接收到的POST参数

一、HTTP模块

html 复制代码
const http = require("http");

// 创建服务器实例
const app = http.createServer((req, res) => {
    // 设置响应头,指定内容类型和编码
    res.setHeader("Content-Type", "text/html;charset=utf-8");
    
    // 根据请求路径返回不同内容
    switch (req.url) {
        case "/":
            res.end("欢迎访问主页!");
            break;
        case "/about":
            res.end("这是关于页面!");
            break;
        default:
            res.statusCode = 404;
            res.end("404 - 页面未找到");
    }
});

// 监听端口并启动服务器
app.listen(5000, () => {
    console.log("服务器已启动!监听在 http://localhost:5000");
});

// 添加错误处理
app.on("error", (error) => {
    console.error(`服务器启动失败: ${error.message}`);
});    

二、静态资源服务器

html 复制代码
const http = require("http");
const fs = require("fs").promises;
const path = require("path");

// 定义静态资源目录
const STATIC_DIR = path.join(__dirname, "static");

// 内容类型映射表
const CONTENT_TYPES = {
    ".html": "text/html",
    ".css": "text/css",
    ".js": "text/javascript",
    ".json": "application/json",
    ".png": "image/png",
    ".jpg": "image/jpeg",
    ".gif": "image/gif",
    ".svg": "image/svg+xml",
    ".txt": "text/plain"
};

const app = http.createServer(async (req, res) => {
    try {
        // 构建文件路径
        let filePath = path.join(STATIC_DIR, req.url === "/" ? "index.html" : req.url);
        
        // 检查文件是否存在
        await fs.access(filePath);
        
        // 获取文件状态
        const stat = await fs.stat(filePath);
        
        if (stat.isDirectory()) {
            // 如果是目录,尝试默认文件
            filePath = path.join(filePath, "index.html");
            await fs.access(filePath);
        }
        
        // 获取文件扩展名并确定内容类型
        const extname = path.extname(filePath);
        const contentType = CONTENT_TYPES[extname] || "application/octet-stream";
        
        // 设置响应头并发送文件内容
        res.setHeader("Content-Type", contentType);
        const fileContent = await fs.readFile(filePath);
        res.end(fileContent);
    } catch (error) {
        // 处理错误
        res.statusCode = 404;
        res.end("404 - 文件未找到");
    }
});

app.listen(3000, () => {
    console.log("服务器监听在 http://localhost:3000");
});    

三、服务器获取get请求参数

在./static下面写一个index.html页面,页面中发送一个get请求

html 复制代码
const http = require("http");
const url = require("url");
const qs = require("querystring");

const app = http.createServer((req, res) => {
    res.setHeader("Content-Type", "text/html;charset=utf-8");
    
    // 解析URL和查询参数
    const parsedUrl = url.parse(req.url, true);
    const pathname = parsedUrl.pathname;
    const query = parsedUrl.query;
    
    if (pathname === "/") {
        // 返回表单页面
        const formHtml = `
            <form method="GET" action="/api">
                <input type="text" name="username" placeholder="用户名">
                <input type="password" name="password" placeholder="密码">
                <button type="submit">提交</button>
            </form>
        `;
        res.end(formHtml);
    } else if (pathname === "/api") {
        // 处理GET请求参数
        res.end(`收到GET请求,参数:${JSON.stringify(query)}`);
    } else {
        res.statusCode = 404;
        res.end("404 - 页面未找到");
    }
});

app.listen(8888, () => {
    console.log("服务器已启动!地址为: http://localhost:8888");
});    

四、服务器获取post请求参数

获取post请求的参数,通过给req绑定事件和end事件,来获取监听的参数,data事件一个接收的事件,end事件 当post请求的参数都接收完毕,就出发end事件

html 复制代码
const http = require("http");
const qs = require("querystring");

const app = http.createServer((req, res) => {
    res.setHeader("Content-Type", "text/html;charset=utf-8");
    
    if (req.url === "/") {
        // 返回表单页面
        const formHtml = `
            <form method="POST" action="/api">
                <input type="text" name="username" placeholder="用户名">
                <input type="password" name="password" placeholder="密码">
                <button type="submit">提交</button>
            </form>
        `;
        res.end(formHtml);
    } else if (req.url === "/api" && req.method === "POST") {
        // 处理POST请求
        let body = "";
        
        // 监听data事件,收集数据块
        req.on("data", (chunk) => {
            body += chunk.toString();
        });
        
        // 监听end事件,数据接收完成
        req.on("end", () => {
            // 解析表单数据
            const formData = qs.parse(body);
            
            // 返回处理结果
            res.end(`收到POST请求,参数:${JSON.stringify(formData)}`);
        });
    } else {
        res.statusCode = 404;
        res.end("404 - 页面未找到");
    }
});

app.listen(8888, () => {
    console.log("服务器已启动!地址为: http://localhost:8888");
});    

每个步骤的代码都可以独立运行,并且包含了必要的注释以便理解

相关推荐
tedcloud1231 小时前
hello-agents部署教程:从零学习AI Agent开发
服务器·人工智能·学习·自动化·powerpoint
qq_265153371 小时前
Redis在游戏服务器中怎么实现开合服数据同步?
服务器·redis·游戏·游戏服务器
szxinmai主板定制专家1 小时前
电力设备RK3568/RK3576+FPGA,多系统混合部署Linux+RTOS RT-THREAD,强实时性
linux·运维·服务器·人工智能·嵌入式硬件·fpga开发
独泪了无痕2 小时前
CryptoJS:数据安全的JavaScript加密利器
前端·vue.js·node.js
我是坑货2 小时前
Jenkins 构建失败排查记录:mvn -U 把新版依赖被远程旧版覆盖
运维·jenkins
L、2182 小时前
CANN调优工具链全景:从profiler到tensorboard的完整观测体系
linux·运维·服务器·深度学习
码点滴3 小时前
Workload 自动化进化论:从手动运维到 AI 驱动的 Kubernetes 智能管控
运维·人工智能·kubernetes·自动化·workload
darkdragonking3 小时前
Docker(五)OpenEuler22.03 安装docker ce、排坑
运维·docker·容器
j_xxx404_3 小时前
Linux进程信号捕捉与操作系统运行本质深度解析
linux·运维·服务器·开发语言·c++·人工智能·ai
eggrall3 小时前
Linux信号——保存信号
linux·运维·服务器