主代码index.js
javascript
复制代码
const http = require("http");
const fs = require("fs");
const path = require("path");
// 读取配置文件
let hostconfig;
try {
hostconfig = JSON.parse(fs.readFileSync("./hostconfig.json", "utf-8"));
} catch (err) {
console.log(666.909, "hostconfig.json is undefined");
}
// 启动HTTP服务
function startHTTPServer(hostdir) {
// 初始化服务配置
const hostcfg = hostconfig.hosts[hostdir];
if (hostcfg.mimetypes) {
Object.assign(hostcfg.mimetypes, hostconfig.mimetypes);
} else {
hostcfg.mimetypes = hostconfig.mimetypes;
}
// 创建服务
hostcfg.server = http.createServer((req, res) => {
// 获取请求的文件相对路径
let filePath = "" + req.url;
if (filePath == "/" || filePath == "") {
filePath = "/index.html";
}
if (hostdir == "home") {
filePath = "." + filePath;
} else {
filePath = "./" + hostdir + filePath;
}
// 使用fs模块读取文件
fs.readFile(filePath, (err, data) => {
if (err) {
// 如果文件不存在或读取错误,返回404状态码
res.writeHead(404, { "Content-Type": "text/plain" });
res.end(`File Path(${filePath}) not found!`);
return;
}
// 设置响应头,并发送文件内容
res.writeHead(200, {
"Content-Type":
hostcfg.mimetypes[path.extname(filePath)] ||
"application/octet-stream",
});
res.end(data);
});
});
// 启动服务
hostcfg.server.listen(hostcfg.port, () => {
console.log(
`[${hostdir}] Server is running on http://localhost:${hostcfg.port}`
);
});
return hostcfg.server;
}
// 循环启动配置中的服务
Object.keys(hostconfig.hosts).forEach((el) => {
startHTTPServer(el);
});
配置文件hostconfig.json
javascript
复制代码
{
"readme": "asai.cc",
"hosts": {
"asai": {
"port": 9090,
"mimetypes": {}
},
"asai.cc/abc": { "port": 9091 }
},
"mimetypes": {
".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"
}
}