fix: 修复 CDN 刷新静默失败问题

- 添加 CDN 刷新日志输出,便于排查问题
- 添加密钥配置检查,未配置时给出明确提示
- 修复生产环境日志不输出的问题
- CDN 刷新失败不影响上传结果,仅记录警告
This commit is contained in:
编程专家
2026-03-25 10:59:54 +08:00
parent 0d98013464
commit 1506c77a53
2 changed files with 49 additions and 16 deletions

View File

@@ -18,12 +18,10 @@ const PORT = process.env.PORT || 3030;
app.use(express.json()); app.use(express.json());
// 生产环境日志(仅关键信息 // 日志函数始终输出PM2 会收集到日志文件
function log(...args) { function log(...args) {
if (process.env.NODE_ENV !== 'production') {
const timestamp = new Date().toISOString(); const timestamp = new Date().toISOString();
console.log(`[${timestamp}]`, ...args); console.log(`[${timestamp}]`, ...args);
}
} }
// 加载完整配置 // 加载完整配置
@@ -503,7 +501,16 @@ async function doUpload(chatId, feishu, uploader, info) {
}); });
const result = await uploader.upload(tempFile, targetKey, bucket); const result = await uploader.upload(tempFile, targetKey, bucket);
await uploader.refreshCDN(bucket, targetKey);
// 刷新 CDN带日志回调
try {
await uploader.refreshCDN(bucket, targetKey, (msg) => {
log(msg);
});
} catch (cdnError) {
log('⚠️ CDN 刷新失败,但上传成功:', cdnError.message);
// CDN 刷新失败不影响上传结果,继续
}
// 获取实际存储桶名称(不是配置别名) // 获取实际存储桶名称(不是配置别名)
const fullConfig = loadFullConfig(); const fullConfig = loadFullConfig();

View File

@@ -153,17 +153,29 @@ class QiniuUploader {
} }
// 刷新 CDN // 刷新 CDN
async refreshCDN(bucketName, key) { async refreshCDN(bucketName, key, logCallback) {
const bucketConfig = this.config.buckets[bucketName]; const bucketConfig = this.config.buckets[bucketName];
if (!bucketConfig) return; if (!bucketConfig) {
if (logCallback) logCallback(`[CDN 刷新] 存储桶 "${bucketName}" 配置不存在`);
return;
}
const { accessKey, secretKey, domain } = bucketConfig; const { accessKey, secretKey, domain } = bucketConfig;
// 检查密钥是否有效
if (!accessKey || !secretKey || accessKey === 'YOUR_ACCESS_KEY' || secretKey === 'YOUR_SECRET_KEY') {
if (logCallback) logCallback(`[CDN 刷新] 警告:存储桶 "${bucketName}" 的密钥未配置,跳过 CDN 刷新`);
return;
}
const fileUrl = `${domain}/${key}`; const fileUrl = `${domain}/${key}`;
if (logCallback) logCallback(`[CDN 刷新] 请求刷新 URL: ${fileUrl}`);
const body = JSON.stringify({ urls: [fileUrl] }); const body = JSON.stringify({ urls: [fileUrl] });
const accessToken = this.generateAccessToken(accessKey, secretKey, 'POST', '/v2/tune/refresh', body); const accessToken = this.generateAccessToken(accessKey, secretKey, 'POST', '/v2/tune/refresh', body);
await this.httpRequest('https://fusion.qiniuapi.com/v2/tune/refresh', { try {
const result = await this.httpRequest('https://fusion.qiniuapi.com/v2/tune/refresh', {
method: 'POST', method: 'POST',
headers: { headers: {
'Host': 'fusion.qiniuapi.com', 'Host': 'fusion.qiniuapi.com',
@@ -172,6 +184,20 @@ class QiniuUploader {
'Authorization': accessToken 'Authorization': accessToken
} }
}, body); }, body);
if (logCallback) logCallback(`[CDN 刷新] 响应状态:${result.status}, 数据:${JSON.stringify(result.data)}`);
if (result.status !== 200) {
throw new Error(`CDN 刷新失败:${JSON.stringify(result.data)}`);
}
if (logCallback) logCallback(`[CDN 刷新] ✅ 刷新成功`);
return result.data;
} catch (error) {
if (logCallback) logCallback(`[CDN 刷新] ❌ 错误:${error.message}`);
throw error;
}
} }
// 生成上传凭证 // 生成上传凭证