54 lines
1.6 KiB
JavaScript
54 lines
1.6 KiB
JavaScript
const { log } = require('./logger');
|
||
const { config } = require('./config');
|
||
|
||
function httpHealthCheck(host, port, path = '/health', timeout = 5000) {
|
||
return new Promise((resolve) => {
|
||
const http = require('http');
|
||
const req = http.get({ hostname: host, port, path, timeout }, (res) => {
|
||
let body = '';
|
||
res.on('data', (chunk) => { body += chunk; });
|
||
res.on('end', () => {
|
||
resolve({ success: res.statusCode >= 200 && res.statusCode < 400, statusCode: res.statusCode });
|
||
});
|
||
});
|
||
req.on('error', (err) => {
|
||
resolve({ success: false, error: err.message });
|
||
});
|
||
req.on('timeout', () => {
|
||
req.destroy();
|
||
resolve({ success: false, error: 'timeout' });
|
||
});
|
||
});
|
||
}
|
||
|
||
async function healthCheck() {
|
||
log.step('健康检查');
|
||
log.subStep('检查后端服务状态...');
|
||
|
||
const maxRetries = 5;
|
||
const retryDelay = 3000;
|
||
|
||
for (let i = 1; i <= maxRetries; i++) {
|
||
const result = await httpHealthCheck('localhost', parseInt(config.backendPort));
|
||
|
||
if (result.success) {
|
||
log.success('后端服务健康检查通过');
|
||
return { success: true };
|
||
}
|
||
|
||
const detail = result.statusCode ? `HTTP ${result.statusCode}` : (result.error || '无响应');
|
||
if (i < maxRetries) {
|
||
log.subStep(`第 ${i} 次检查失败 (${detail}),${retryDelay/1000}秒后重试...`);
|
||
await new Promise(resolve => setTimeout(resolve, retryDelay));
|
||
}
|
||
}
|
||
|
||
log.warning('健康检查未通过,请手动验证服务状态');
|
||
return { success: false };
|
||
}
|
||
|
||
module.exports = {
|
||
httpHealthCheck,
|
||
healthCheck,
|
||
};
|