node原生实现静态资源服务器实例(仅作学习记录)

const http = require('http'); // 引入HTTP模块用于创建web服务器
const url = require('url'); // 引入URL模块用于解析URL
const fs = require('fs'); // 引入文件系统模块用于读取文件
const path = require('path'); // 引入路径模块用于处理路径
const mimes = { // MIME类型映射对象
  js: 'application/javascript',
  css: 'text/css',
  html: 'text/html',
  txt: 'text/plain',
  png: 'image/png',
  jpg: 'image/jpeg',
  jpeg: 'image/jpeg',
  gif: 'image/gif',
  svg: 'image/svg+xml',
  json: 'application/json',
  pdf: 'application/pdf',
  mp4: 'video/mp4',
  webm: 'video/webm',
  mp3: 'audio/mpeg',
  wav: 'audio/wav',
  // 可以继续添加更多类型
};
const server = http.createServer((req, res) => { // 创建HTTP服务器
    const parsedUrl = url.parse(req.url, true); // 解析请求的URL
    let pathname = parsedUrl.pathname; // 获取请求路径

    if (pathname === '/') { // 处理根路径请求
        fs.readFile('./index.html', (err, data) => { // 尝试读取index.html文件
            if (err) { // 如果读取失败
                handleError(res, 500, 'Internal Server Error'); // 调用错误处理函数返回500状态码
                return;
            }
            res.setHeader('Content-Type', 'text/html;charset=utf-8'); // 设置响应头为HTML类型
            res.end(data); // 发送文件内容
        });
    } else { // 处理其他路径请求
        pathname = '.' + decodeURIComponent(pathname); // 解码并构造实际文件路径
        fs.readFile(pathname, (err, data) => { // 尝试读取文件
            if (err) { // 如果读取失败
                if (err.code === 'ENOENT') { // 特别处理文件未找到错误
                    handleError(res, 404, 'Not Found'); // 返回404状态码
                } else {
                    handleError(res, 500, 'Internal Server Error'); // 其他错误返回500状态码
                }
                return;
            }
            // 获取文件扩展名并设置MIME类型
            const ext = path.extname(pathname).substring(1);
            const type = mimes[ext] || 'application/octet-stream'; // 如果找不到对应的MIME类型,则使用默认类型
            res.setHeader('Content-Type', `${type};charset=utf-8`); // 设置响应头的Content-Type
            res.end(data); // 发送文件内容
        });
    }
});

// 错误处理函数
function handleError(res, statusCode, message) {
    res.writeHead(statusCode, { 'Content-Type': 'text/plain;charset=utf-8' }); // 设置错误状态码和响应头
    res.end(`${statusCode} ${message}`); // 发送错误信息
}

server.listen(3000, () => { // 监听3000端口
    console.log('Server is running on port 3000'); // 启动成功提示
});

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值