Next.js GenerateMetAdata не применяется правильно с условным рендерингом в макете - метаданные загружаются только после Javascript

Форум по Javascript
Ответить
Anonymous
 Next.js GenerateMetAdata не применяется правильно с условным рендерингом в макете - метаданные загружаются только после

Сообщение Anonymous »

Я работаю над мультитенантным приложением Next.js, где я испытываю проблему с генерацией метаданных. Когда существует действительный поддомен и найдено арендатор, все работает отлично - приложение и метаданные применяются правильно. Тем не менее, когда проверка арендатора не выполняется, а условное рендеринг запускается, метаданные для недопустимого арендатора не загружаются, если я не сделаю изменение кода, которое запускает Next.js Hot Reload - только тогда появляется метаданные. (Пожалуйста, будьте хорошим, я новичок в NextJS LMAO)
sstrong> layout.tsx:

Код: Выделить всё

import type { Metadata } from "next";

import "./globals.css";
import { getTenantData } from "@/lib/utils";
import MissingSubdomainError from "@/components/errors/MissingSubdomainError";
import InvalidTenantError from "@/components/errors/InvalidTenantError";
import { TenantProvider } from "@/components/providers/tenant-provider";

export async function generateMetadata(): Promise {
const { subdomain, tenant } = await getTenantData();

if (!subdomain) {
return {
title: "Subdominio no definido",
description: "No se proporcionó un subdominio válido",
};
}

if (!tenant) {
return {
title: "Tenant inválido",
description: `No se encontró ningún tenant llamado "${subdomain}"`,
};
}

return {
title: tenant.name,
description: `Sitio de ${tenant.name}`,
};
}

export default async function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
const { subdomain, tenant } = await getTenantData();

if (!subdomain) return ;
if (!tenant) return ;

return (



{children}



);
}

invalidtenanterror.tsx:

Код: Выделить всё

export default function InvalidTenantError({
subdomain,
}: {
subdomain: string;
}) {
return (




Subdominio inválido


El subdominio{" "}
{subdomain} no
está registrado.

Verifica que lo hayas escrito correctamente.  Por ejemplo:


empresa.localhost
Si crees que esto es un error o necesitas ayuda, contáctanos.



);
}


utils.ts:

Код: Выделить всё

import { headers } from "next/headers";
import { prisma } from "./prisma";

export async function validateTenant(subdomain: string) {
try {
const tenant = await prisma.tenant.findUnique({
where: {
subdomain: subdomain,
active: true,
},
});

return tenant;
} catch (error) {
console.error("Error validating tenant:", error);
return null;
}
}

export async function getTenantData() {
const headersList = await headers();
const subdomain = headersList.get("x-tenant");

if (!subdomain) {
return { subdomain: null, tenant: null };
}

const tenant = await validateTenant(subdomain);
return { subdomain, tenant };
}
package.json:

Код: Выделить всё

{
"name": "tenanttest",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev --turbopack",
"build": "prisma generate && next build",
"start": "next start",
"lint": "next lint",
"db:seed": "tsx prisma/seed.ts"
},
"dependencies": {
"@prisma/client": "^6.8.2",
"next": "15.3.2",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"zustand": "^5.0.5"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
"@tailwindcss/postcss": "^4",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"eslint": "^9",
"eslint-config-next": "15.3.2",
"prisma": "^6.8.2",
"tailwindcss": "^4",
"tsx": "^4.19.4",
"typescript": "^5"
}
}

Метаданные работают
метаданные не работают

Подробнее здесь: https://stackoverflow.com/questions/796 ... ring-in-la
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»