fix: usar normalizeTitleForMatch en import de productos + notFound() en generateMetadata
Build and Push Frontend / Escaneo de Secretos (Gitleaks) (push) Successful in 33s
Build and Push Medusa / Escaneo de Secretos (Gitleaks) (push) Successful in 23s
Build and Push Frontend / Construir y Subir Imagen (push) Successful in 20m5s
Build and Push Medusa / Construir y publicar Medusa (push) Successful in 27m10s
Build and Push Frontend / Escaneo de Secretos (Gitleaks) (push) Successful in 33s
Build and Push Medusa / Escaneo de Secretos (Gitleaks) (push) Successful in 23s
Build and Push Frontend / Construir y Subir Imagen (push) Successful in 20m5s
Build and Push Medusa / Construir y publicar Medusa (push) Successful in 27m10s
El importador de commerce-backend definia normalizeTitleForMatch (colapsa guion largo/comillas tipograficas) pero nunca la usaba en el matching de producto/categoria/coleccion -- seguia comparando con toLowerCase().trim() plano, por eso un re-import de "Toy Story 5 - Woody" con guion largo pegado desde Excel volvio a crear un duplicado en vez de actualizar el existente. En el storefront, cualquier slug de producto inexistente devolvia HTTP 200 en vez de 404 (confirmado con un slug inventado): el Suspense del navbar hace que el layout empiece a stream-ear la respuesta con status 200 antes de que notFound() se ejecute dentro de la pagina. Se mueve la verificacion a generateMetadata, que se resuelve completo antes de iniciar el stream. Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
1 parent
7dd2c139cb
commit
cc7ddddf58
2 files changed
+51
-14
No files matched your search
@@ -24,7 +24,17 @@ export const dynamic = "force-dynamic";
|
||||
export async function generateMetadata({ params }: ProductPageProps): Promise<Metadata> {
|
||||
const { slug } = await params;
|
||||
const product = await getProductBySlug(slug);
|
||||
return product ? { title: product.name, description: product.shortDescription, openGraph: { images: [product.image] } } : { title: "Producto" };
|
||||
// notFound() se llama aquí (no solo en el componente de abajo) porque
|
||||
// generateMetadata se resuelve por completo ANTES de que Next empiece a
|
||||
// transmitir la respuesta -- el <Suspense> del navbar (categorías, ver
|
||||
// navbar.tsx) hace que el layout raíz empiece a stream-ear con status 200
|
||||
// antes de que un notFound() lanzado dentro del componente de la página
|
||||
// pueda cambiarlo (confirmado en vivo: cualquier slug inexistente devolvía
|
||||
// HTTP 200 con el contenido de app/not-found.tsx, rompiendo SEO/crawlers
|
||||
// que sí miran el status code). Llamarlo aquí evita el problema porque esta
|
||||
// fase bloquea el stream por diseño.
|
||||
if (!product) notFound();
|
||||
return { title: product.name, description: product.shortDescription, openGraph: { images: [product.image] } };
|
||||
}
|
||||
|
||||
export default async function ProductPage({ params }: ProductPageProps) {
|
||||
|
||||
Reference in new issue
Block a user