搭建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");
});    

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

相关推荐
CodeHackerBhx8 分钟前
Jenkins
java·运维·jenkins
小白不想白a11 分钟前
【docker】namespace 命名空间
运维·docker·容器
小z博客16 分钟前
使用Docker轻松部署Zurl搭建自己的短链接服务
运维·docker·容器
橘颂TA35 分钟前
【Linux】特效爆满的Vim的配置方法 and make/Makefile原理
linux·运维·服务器·vim
若梦plus40 分钟前
Node.js中util.promisify原理分析
前端·node.js
AI大法师1 小时前
企业级Linux服务器安全:防火墙规则配置与Web/SSH服务优化指南
linux·服务器·安全
Fanmeang1 小时前
VGMP(VRRP Group Management Protocol)VRRP组管理协议
运维·网络·华为·防火墙·vrrp·双机热备·vgmp
Hat_man_2 小时前
如何在虚拟机(Linux)安装Qt5.15.2
linux·运维·服务器
LLLLYYYRRRRRTT2 小时前
12. SELinux 加固 Linux 安全
linux·运维·安全
我是小bā吖3 小时前
使用阿里云服务器部署dify实战
服务器·阿里云·dify