Fix 500 Internal Server Error: Add error handling for D1 database access in Cloudflare Pages

This commit is contained in:
katelya
2025-09-05 16:05:52 +08:00
parent 142c780b50
commit 07cdaafcb2
3 changed files with 47 additions and 15 deletions
+7
View File
@@ -14,6 +14,9 @@ const inter = Inter({ subsets: ['latin'] });
// 动态生成 metadata,支持配置更新后的标题变化 // 动态生成 metadata,支持配置更新后的标题变化
export async function generateMetadata(): Promise<Metadata> { export async function generateMetadata(): Promise<Metadata> {
let siteName = process.env.SITE_NAME || 'KatelyaTV'; let siteName = process.env.SITE_NAME || 'KatelyaTV';
try {
// 只有在非 d1 和 upstash 存储类型时才尝试获取配置
if ( if (
process.env.NEXT_PUBLIC_STORAGE_TYPE !== 'd1' && process.env.NEXT_PUBLIC_STORAGE_TYPE !== 'd1' &&
process.env.NEXT_PUBLIC_STORAGE_TYPE !== 'upstash' process.env.NEXT_PUBLIC_STORAGE_TYPE !== 'upstash'
@@ -21,6 +24,10 @@ export async function generateMetadata(): Promise<Metadata> {
const config = await getConfig(); const config = await getConfig();
siteName = config.SiteConfig.SiteName; siteName = config.SiteConfig.SiteName;
} }
} catch (error) {
// 如果配置获取失败,使用默认站点名称
// siteName 已经有默认值,不需要额外处理
}
return { return {
title: siteName, title: siteName,
+10
View File
@@ -225,16 +225,21 @@ async function initConfig() {
export async function getConfig(): Promise<AdminConfig> { export async function getConfig(): Promise<AdminConfig> {
const storageType = process.env.NEXT_PUBLIC_STORAGE_TYPE || 'localstorage'; const storageType = process.env.NEXT_PUBLIC_STORAGE_TYPE || 'localstorage';
if (process.env.DOCKER_ENV === 'true' || storageType === 'localstorage') { if (process.env.DOCKER_ENV === 'true' || storageType === 'localstorage') {
await initConfig(); await initConfig();
return cachedConfig; return cachedConfig;
} }
// 非 docker 环境且 DB 存储,直接读 db 配置 // 非 docker 环境且 DB 存储,直接读 db 配置
try {
const storage = getStorage(); const storage = getStorage();
let adminConfig: AdminConfig | null = null; let adminConfig: AdminConfig | null = null;
if (storage && typeof (storage as any).getAdminConfig === 'function') { if (storage && typeof (storage as any).getAdminConfig === 'function') {
adminConfig = await (storage as any).getAdminConfig(); adminConfig = await (storage as any).getAdminConfig();
} }
if (adminConfig) { if (adminConfig) {
// 合并一些环境变量配置 // 合并一些环境变量配置
adminConfig.SiteConfig.SiteName = process.env.SITE_NAME || 'KatelyaTV'; adminConfig.SiteConfig.SiteName = process.env.SITE_NAME || 'KatelyaTV';
@@ -306,6 +311,11 @@ export async function getConfig(): Promise<AdminConfig> {
await initConfig(); await initConfig();
} }
return cachedConfig; return cachedConfig;
} catch (error) {
// 如果数据库访问失败,回退到默认配置
await initConfig();
return cachedConfig;
}
} }
export async function resetConfig() { export async function resetConfig() {
+15
View File
@@ -39,9 +39,24 @@ interface D1ExecResult {
// 获取全局D1数据库实例 // 获取全局D1数据库实例
function getD1Database(): D1Database { function getD1Database(): D1Database {
// 在 Cloudflare Pages/Workers 环境中,DB 是全局变量
if (typeof globalThis !== 'undefined' && (globalThis as any).DB) {
return (globalThis as any).DB as D1Database;
}
// 回退到 process.env(用于本地开发)
if ((process.env as any).DB) {
return (process.env as any).DB as D1Database; return (process.env as any).DB as D1Database;
} }
// 最后尝试从 globalThis.process.env
if (typeof globalThis !== 'undefined' && (globalThis as any).process?.env?.DB) {
return (globalThis as any).process.env.DB as D1Database;
}
throw new Error('D1 database not available. Make sure DB binding is configured.');
}
export class D1Storage implements IStorage { export class D1Storage implements IStorage {
private db: D1Database | null = null; private db: D1Database | null = null;