Configure dynamic rendering and robust DB init for Vercel
This commit is contained in:
@@ -28,6 +28,8 @@ export const metadata: Metadata = {
|
||||
// This is appropriate for a social network where all content is user-generated
|
||||
export const dynamic = 'force-dynamic';
|
||||
|
||||
// This is appropriate for a social network where all content is user-generated
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: {
|
||||
|
||||
+10
-25
@@ -2,33 +2,18 @@ import { drizzle, NeonHttpDatabase } from 'drizzle-orm/neon-http';
|
||||
import { neon } from '@neondatabase/serverless';
|
||||
import * as schema from './schema';
|
||||
|
||||
// Lazy initialization to prevent build-time crashes
|
||||
let _db: NeonHttpDatabase<typeof schema> | null = null;
|
||||
// Best Practice:
|
||||
// In Vercel builds, environment variables might be missing during the "Build" step.
|
||||
// We provide a fallback connection string to allow the code to load and type-check.
|
||||
// The app will fail fast at runtime if it tries to actually query with this invalid URL.
|
||||
const connectionString = process.env.DATABASE_URL || 'postgres://placeholder:placeholder@localhost:5432/placeholder';
|
||||
|
||||
export const db = new Proxy({} as NeonHttpDatabase<typeof schema>, {
|
||||
get: (target, prop) => {
|
||||
if (!_db) {
|
||||
if (!process.env.DATABASE_URL) {
|
||||
// Allow build to pass by returning a dummy if accessed during build
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
console.warn('Database accessed during build without DATABASE_URL. Returning dummy.');
|
||||
// We return a proxy that logs on any access to avoid hard crashes if possible,
|
||||
// but typically this path is creating the client.
|
||||
// Returning a dummy DB object that matches the shape is hard.
|
||||
// But if we throw, we crash.
|
||||
// The issue is verify the build doesn't crash on import.
|
||||
// If we are here, something ACCESSED db.
|
||||
}
|
||||
throw new Error('DATABASE_URL is not defined');
|
||||
}
|
||||
const sql = neon(process.env.DATABASE_URL);
|
||||
_db = drizzle(sql, { schema });
|
||||
}
|
||||
return Reflect.get(_db, prop);
|
||||
},
|
||||
});
|
||||
const sql = neon(connectionString);
|
||||
|
||||
// Helper to check if DB is available
|
||||
// Create the Drizzle client with the specific schema type
|
||||
export const db = drizzle(sql, { schema });
|
||||
|
||||
// Helper to check if DB is configured (useful for UI checks)
|
||||
export const isDbAvailable = () => !!process.env.DATABASE_URL;
|
||||
|
||||
// Export schema for use elsewhere
|
||||
|
||||
Reference in New Issue
Block a user