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'); // 启动成功提示
});
node原生实现静态资源服务器实例(仅作学习记录)
最新推荐文章于 2024-08-16 11:05:09 发布