Files
yunhaifinance/backups/20260325_002423/frontend/server.js
T

80 lines
2.3 KiB
JavaScript

import http from 'http';
import fs from 'fs';
import path from 'path';
const server = http.createServer((req, res) => {
// 处理静态文件请求
let filePath = '.' + req.url;
// 处理根路径
if (filePath === './') {
filePath = './index.html';
}
// 获取文件扩展名
const extname = String(path.extname(filePath)).toLowerCase();
// MIME类型映射
const mimeTypes = {
'.html': 'text/html',
'.js': 'text/javascript',
'.mjs': 'text/javascript',
'.ts': 'text/javascript',
'.tsx': 'text/javascript',
'.css': 'text/css',
'.json': 'application/json',
'.png': 'image/png',
'.jpg': 'image/jpg',
'.gif': 'image/gif',
'.svg': 'image/svg+xml',
'.wav': 'audio/wav',
'.mp4': 'video/mp4',
'.woff': 'application/font-woff',
'.ttf': 'application/font-ttf',
'.eot': 'application/vnd.ms-fontobject',
'.otf': 'application/font-otf',
'.wasm': 'application/wasm'
};
// 获取内容类型
const contentType = mimeTypes[extname] || 'application/octet-stream';
// 读取文件
fs.readFile(filePath, (error, content) => {
if (error) {
if(error.code == 'ENOENT') {
// 对于HTML、TypeScript、JavaScript文件和根路径,返回index.html
// 这样React的路由系统就可以处理这些请求
const urlExt = path.extname(req.url);
if (req.url.endsWith('.html') ||
req.url === '/' ||
!urlExt ||
urlExt === '.ts' ||
urlExt === '.tsx' ||
urlExt === '.js' ||
urlExt === '.mjs') {
fs.readFile('./index.html', (error, content) => {
res.writeHead(200, { 'Content-Type': 'text/html' });
res.end(content, 'utf-8');
});
} else {
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('File not found', 'utf-8');
}
}
else {
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end('Server error: ' + error.code, 'utf-8');
}
}
else {
res.writeHead(200, { 'Content-Type': contentType });
res.end(content, 'utf-8');
}
});
});
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}/`);
});