From fe1f79b273d5a1d1ecb56ad9b5013e2c81adc77a Mon Sep 17 00:00:00 2001 From: mtvpls Date: Sun, 1 Mar 2026 16:07:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E5=8F=AF?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E6=98=AF=E5=90=A6=E5=AE=8C=E6=88=90=E5=86=8D?= =?UTF-8?q?=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + src/app/api/cron/[password]/route.ts | 26 ++++++++++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f2dc473..977a9ed 100644 --- a/README.md +++ b/README.md @@ -339,6 +339,7 @@ dockge/komodo 等 docker compose UI 也有自动更新功能 | USERNAME | 站长账号 | 任意字符串 | 无默认,必填字段 | | PASSWORD | 站长密码 | 任意字符串 | 无默认,必填字段 | | CRON_PASSWORD | 定时任务 API 访问密码(用于保护 /api/cron 端点) | 任意字符串 | mtvpls | +| CRON_WAIT_FOR_COMPLETION | 定时任务接口是否等待任务完全结束后再返回响应(true 时返回 200,false 时立即返回 202) | true/false | false | | CRON_USER_BATCH_SIZE | 定时任务用户批处理大小(控制并发处理的用户数量,影响播放记录和收藏更新任务的并发性能) | 正整数 | 3 | | SITE_BASE | 站点 url | 形如 https://example.com | 空 | | NEXT_PUBLIC_SITE_NAME | 站点名称 | 任意字符串 | MoonTV | diff --git a/src/app/api/cron/[password]/route.ts b/src/app/api/cron/[password]/route.ts index 70a21f0..6203153 100644 --- a/src/app/api/cron/[password]/route.ts +++ b/src/app/api/cron/[password]/route.ts @@ -58,13 +58,27 @@ export async function GET( // 更新最后执行时间 lastExecutionTime = now; - cronJob(); + // 环境变量控制是否等待定时任务完全结束后再返回响应(默认 false) + // 用于防止 Vercel 等平台杀后台进程 + const waitForCompletion = process.env.CRON_WAIT_FOR_COMPLETION === 'true'; - return NextResponse.json({ - success: true, - message: 'Cron job executed successfully', - timestamp: new Date().toISOString(), - }); + if (waitForCompletion) { + // 等待定时任务完成后再返回 200 + await cronJob(); + return NextResponse.json({ + success: true, + message: 'Cron job executed successfully', + timestamp: new Date().toISOString(), + }); + } else { + // 立即返回 202,定时任务在后台执行 + cronJob(); + return NextResponse.json({ + success: true, + message: 'Cron job accepted and running in background', + timestamp: new Date().toISOString(), + }, { status: 202 }); + } } catch (error) { console.error('Cron job failed:', error);