1
0

fix: 修复未处理的Promise拒绝和文件流错误导致的进程崩溃

- 添加全局异常捕获(uncaughtException, unhandledRejection)防止进程意外退出
- 修复请求合并逻辑中Promise链处理不当导致的Unhandled Promise Rejection
- 为文件读取流添加错误监听,防止文件系统异常导致进程崩溃
- 更新README.md文档以反映稳定性修复
- 将*.log添加到.gitignore忽略日志文件
This commit is contained in:
2026-01-25 03:09:00 +08:00
parent e9bfa3c61f
commit 27b801ea3d
3 changed files with 29 additions and 8 deletions

View File

@@ -6,6 +6,15 @@ const path = require('path');
const crypto = require('crypto');
const net = require('net');
// 全局错误捕获,防止进程退出
process.on('uncaughtException', (err) => {
console.error('[FATAL] Uncaught Exception:', err);
});
process.on('unhandledRejection', (reason, promise) => {
console.error('[FATAL] Unhandled Rejection:', reason);
});
require('dotenv').config();
const app = express();
const PORT = Number(process.env.PORT) || 11489;
@@ -301,6 +310,10 @@ async function handleProxyRequest(res, upstreamUrl, targetUrl) {
}
const stream = fs.createReadStream(dataPath);
stream.on('error', (streamErr) => {
console.error(`[stream-error] ${streamErr.message}`);
if (!res.headersSent) res.end();
});
stream.pipe(res);
return;
} else {
@@ -319,13 +332,12 @@ async function handleProxyRequest(res, upstreamUrl, targetUrl) {
console.log(`[coalesce-hit] joining pending request for ${upstreamUrl}`);
resultPromise = pendingRequests.get(key);
} else {
resultPromise = fetchAndCache(upstreamUrl, targetUrl, key);
// 创建 Promise 链,确保 finally 包含在内,防止 Unhandled Rejection
resultPromise = fetchAndCache(upstreamUrl, targetUrl, key)
.finally(() => {
pendingRequests.delete(key);
});
pendingRequests.set(key, resultPromise);
// 无论成功失败,结束后移除 map
resultPromise.finally(() => {
pendingRequests.delete(key);
});
}
const result = await resultPromise;
@@ -353,6 +365,10 @@ async function handleProxyRequest(res, upstreamUrl, targetUrl) {
res.set('Cache-Control', 'public, max-age=315360000, immutable');
res.type(meta.contentType);
const stream = fs.createReadStream(dataPath);
stream.on('error', (streamErr) => {
console.error(`[stream-error] ${streamErr.message}`);
if (!res.headersSent) res.end();
});
stream.pipe(res);
return;
}