next.js: Add `app/` directory support for custom title in Error page
Describe the feature you’d like to request
I would like to have the possibility to control the page title, description etc. in the error and not-found page.
currently Its possible to get around not-found page by creating a conditional in metadata function for the not-found page but is still not nice.
Describe the solution you’d like
I would like not-found.js and error.js accept metadata and generateMetadata() similar to page.js and layout.js
// app/entity/[entityId]/not-found.js
export async function generateMetadata(props) {
return {
title: `entity ${props.params.entityId} not found`,
description: `There is no entity with id: ${props.params.entityId}`
}
}
export default function EntityNotFound() {
return <div>Sorry this Entity was not found</div>;
}
// app/error.js
export const metadata = {
title: "Error",
description: "ups something went wrong"
}
export default function Error() {
return <div>Sorry this Entity was not found</div>;
}
Describe alternatives you’ve considered
for not-found, maybe allow to pass the metadata object as an argument for the function
export default async function AnimalPage(props) {
const singleEntity = await getAnimalById(props.params.entityId);
if (!singleEntity) {
const metadata = {
title: `entity ${props.params.entityId} not found`,
description: `There is no entity with id: ${props.params.entityId}`
}
notFound(metadata);
}
return <>
... rest of the component
}
About this issue
- Original URL
- State: open
- Created a year ago
- Reactions: 49
- Comments: 30 (11 by maintainers)
Would love this feature as well. Running a i18n site with this folder structure ->
[locale]/not-found.tsxI want to be able to get the locale param so we can fetch correct translations for not-found page.
Workaround
I guess for a static title, this hack can be used with the App Router (doesn’t result in a hydration error, interestingly enough):
Maybe this is what it will look like in the future once React Float more fully lands…
Or @gnoff @sebmarkbage should this already work now with the current state of React Float + Next.js? Was really surprised by lack of hydration error in both dev and production 🤔
Update Feb 2024: Maybe this is actually the new Document Metadata feature mentioned in the React Labs Feb 2024 “What We’ve Been Working On” blog post:
A related issue I don’t see mentioned here is that without metadata in error pages, the
viewportmeta tag is missing and mobile layouts are broken.@huozhi Any ETA on when
paramssupport will be added to thenot-found.jspage? I find it hard to believe that Next doesn’t support localized 404 pages out of the box, that seems like a pretty important feature.I see, dynamic routes with params makes sense. We’ll think of support for that case
Did some research around metadata support for
not-foundanderrorconvention. It’s possible to support innot-foundwhen it’s server components as currently metadata is only available but forerrorit has to be client components then it’s hard to support it there as it’s a boundary. To support that it requires more changes in next.js to make them possible.Meanwhile, to solve the issue of page titles on 404-pages, assuming you have:
Then your not-found metadata currently cannot come from your not-found.tsx file, instead, you are to put it into your page.tsx file:
My issue with this is that I want the not-found page to be exclusively responsible for deciding how a 404-situation would look and feel. Now I need to make two files responsible for it, and I even need to do
pageExistsin both the page component and thegenerateMetadatafunction.But at least it works 😃
Should
generateMetadatawork innot-foundfile then? I’m testing inv13.4.19and it’s nothing.Oh too bad, so no way to generate dynamic titles / descriptions based on the requested content 🙁
Maybe there would still be some ways to support
generateMetadata()eg:notFound()used withingenerateMetadata()innot-found.tsx/error.tsx, throw an errorNext.js 14.0.4 using App Router and
not-found.tsx:It works when I load the page, briefly, but the
page.tsxin the same folder overwrites the title immediately.Tested in developer-mode. Obviously, that should not happen.
Reading the docs: https://nextjs.org/docs/app/building-your-application/optimizing/metadata
…also doesn’t clear up the issue. Pages like
not-found.tsxaren’t part of the hierarchy, I suppose.Nope… at least for me, I’m testing 14.0 and my issue is still there. I have title and description defined statically in a parent layout file, and then in a child route an error file that simply tries to redefine them statically. When the error page loads, it shows for a fraction of second the correct metadata, and then it reverts back to the layout (parent) one. This happens in both dev and prod builds… I agree that Next has a ton of weird issues in apparently basic features, it makes me miss the good old client-server model…
@huozhi The not found page is refreshing every 3 seconds and we don’t have
<link rel="icon" href="/favicon.ico" type="image/x-icon" sizes="any">tag.@bacvietswiss that issue is fixed in #50044
Currently, I need to manually add
<meta name="viewport" content="width=device-width, initial-scale=1" ></meta>into the not found page in order to make it responsiveI’m also hoping this feature is added soon. We were able to do this in the
pagesdirectory using<Head>, so it’d be nice to have it with theappdirectory too 😄Just like @karlhorky mentioned
works. But I am using template
So for someone like me, I had to write the below code
The <title> in my not-found.tsx replaces my template’s fallback Title as well. I know its obvious, but I just wanted to let ya’ll know
@itsjavi One possible workaround for that is similar to https://github.com/vercel/next.js/issues/48763#issuecomment-1623745516
…you can use a catch all route and put a
page.jsunder it, and then populategenerateMetadata.A possibly simpler interim solution to keep everything in
not-found.jsmay be to just update the title in the client side DOM e.g.useEffect(() => document.title = "Page Not Found")…as I suppose for error pages other meta tags are probably less important and don’t really need SSR support.
However, I agree with this issue that error pages should have their own
generateMetadatamethod, as it would be a cleaner and more consistent.Regarding the custom metadata for the not-found.js page, maybe I’ve found a workaround!
Currently, we are facing a problem where we throw a notFound() error when no page is found in our dynamic route. At that time, we don’t see the meta title and description of the not-found.js page. Instead, we see the meta data of the current page. I believe this is logical and not a bug in Next.js. In the case of a dynamic route, the meta data of the not-found.js page should also be dynamic, as it might be useful in some scenarios.
So, in the case of a dynamic route, we can set the meta data for the not-found.js page dynamically from page.js. It’s important to note that the generateMetadata function should not throw a notFound error. Instead, the page component should throw a notFound error. For example, you can see the screenshot below. I hope this solution works.
My folder structure:
No. I give up Next for now. I had a lot of problems and a lot of weird bugs.
I have something working for me. I determine if I am in a 404 state in generateMetadata for a route like. [blah]/page.tsx and return something like { title: ‘Not Found’ } in [blah]/not-found.tsx I just have the error markup. The meta data from page.tsx is present when I get my 404 hit I get the metadata set in page.tsx + <meta name="robots" content="noindex"/> added by the notFound() call. (notFound() is called in page.tsx’s component tree, not in generateMetadata of [blah]/page.tsx
Sure, I was thinking of something kind of similar to the one in the issue description: