#Missing /_not-found/page: /_not-found with app router

88 messages · Page 1 of 1 (latest)

topaz osprey
#

So I am trying to build my project with i18n internationalization and it seems to stop compiling because it can't find the _not-found.tsx. Not matter where in the app directory I put the file, it will not find it. But as soon as I put it in the pages directory (even though I am using app directory) it will complain about a conflict with some not-found file in next/dist/client/components/... . This is the same for the error routes, but these don't have conflicts in the pages directory.

lapis breachBOT
#

🔎 This post has been indexed in our web forum and will be seen by search engines so other users can find it outside Discord

🕵️ Your user profile is private by default and won't be visible to users outside Discord, if you want to be visible in the web forum you can add the "Public Profile" role in id:customize

✅ You can mark a message as the answer for your post with Right click -> Apps -> Mark Solution
(if you don't see the option, try refreshing Discord with Ctrl + R)

prisma sonnet
#

Is this your file structure @topaz osprey ?

app
|-- [lang]
    |-- page.tsx       // Main page for locale
    |-- not-found.tsx  // Not Found page for locale
    |-- error.tsx      // Error boundary for locale segment
|-- global-error.tsx   // Global error for the entire app
|-- layout.tsx         // Global layout
|-- page.tsx           // Root page
topaz osprey
#

This is my current tree:

    _not-found.tsx (will not be found)
│   └───[locale]
│       ├───about
│       ├───blog
│       │   └───blogs
│       ├───buildattack
│       ├───dashboard
│       │   ├───post-its
│       │   └───scheduler
│       ├───help-feedback
│       ├───hooks
│       ├───login
│       ├───logout
│       ├───profile
│       ├───projects
│       ├───settings
│       ├───[...rest]
        ├───_not-found.tsx (will not be found)
        ├───providers.tsx //i18n configuration
        ├───layout.tsx //Root layout
        └───page.tsx //Root page
├───components
│   ├───blog
│   ├───cards
│   ├───dashboard
│   └───login
├───config
├───i18n
├───pages
  _error.tsx
  _not-found.tsx (will result in conflict)
└───styles
#

@prisma sonnet

topaz osprey
#

Oh yeah. that is me typing it in here

prisma sonnet
#

not even underscore is needed before

prisma sonnet
topaz osprey
#

The file in my IDE is correctly spelled but my tree doesn't show files

prisma sonnet
#

before

topaz osprey
#

okay one sec removing underscore

#

Removing _ outside of the [locale] will result in this (If I add the layout it will get treated as a normal page and it will return to the old error.

Having not-found.tsx in my [locale] folder, it will go back to showing this error on build:

        /_not-found/page: /_not-found
#

I had the same issue with error.tsx and the only way to make it work is to add it into the pages directory

prisma sonnet
#

remove not-found.tsx from app folder, and put it inside locale only

topaz osprey
#

I can't add the _not-found.tsx there though, because I run into a conflict

prisma sonnet
prisma sonnet
topaz osprey
#

This is my current tree:

│   └───[locale]
│       ├───about
│       ├───blog
│       │   └───blogs
│       ├───buildattack
│       ├───dashboard
│       │   ├───post-its
│       │   └───scheduler
│       ├───help-feedback
│       ├───hooks
│       ├───login
│       ├───logout
│       ├───profile
│       ├───projects
│       ├───settings
│       ├───[...rest]
        ├───not-found.tsx (will not be found)
        ├───providers.tsx //i18n configuration
        ├───layout.tsx //Root layout
        └───page.tsx //Root page
├───components
│   ├───blog
│   ├───cards
│   ├───dashboard
│   └───login
├───config
├───i18n
├───pages
  _error.tsx
└───styles

This is the layout now. The not-found.tsx is inside [locale] and it is not being found. I get > Export encountered errors on following paths: /_not-found/page: /_not-found
If I put the _ infront, same thing

prisma sonnet
#

whats your nextjs version?

topaz osprey
prisma sonnet
#

can you send your not-found.tsx file?

topaz osprey
#
export const dynamic = "force-dynamic";
import { redirect } from "next/navigation";

export default function _notFound() {
  redirect("/");
  return <div></div>;
}
#

Should I try and use NotFound() as the function to export?

prisma sonnet
#

Can you try removing redirect first

topaz osprey
prisma sonnet
#

Yes

#

Ai genereted answer, could be wrong

prisma sonnet
topaz osprey
#

lol

#

Okay

#

so

prisma sonnet
#

is it working/

topaz osprey
#

neither this

export const dynamic = "force-dynamic";
import { redirect } from "next/navigation";

export default function NotFound() {
  return <div></div>;
}

nor the same with _notFound() works

#

So as far as I can tell is, that it is trying to find not-found.tsx in the pages directory

#

which shouldn't be a thing since I am using app directory

prisma sonnet
topaz osprey
#

The same happened to error.tsx but that one doesn't conflict

topaz osprey
#

Ye still not finding the file

prisma sonnet
#

commenting*

topaz osprey
#

Error if I put it in the pages folder (with _ notation):

 ⨯   "pages/_not-found.tsx" - "next/dist/client/components/not-found-error"
#

Also commenting doesn't change it

prisma sonnet
#

For now, just don't even use pages dir

#

delete pages dir completely, it won't help at all

#

And can you send your layout file?

topaz osprey
#

This will add two new problems;

> Export encountered errors on following paths:
        /_error: /404
        /_error: /500
        /_not-found/page: /_not-found

because the pages directory contained the _error.tsx (I have a seperate error.tsx in the app directory under [locale] but same as with the not-found it will not get registered.

topaz osprey
# prisma sonnet And can you send your layout file?

Top layout.tsx:

import "@/src/styles/globals.css";
import { Metadata, Viewport } from "next";
import { Link } from "@nextui-org/link";
import clsx from "clsx";

import { Providers } from "./providers";

import { siteConfig } from "@/src/config/site";
import { fontSans } from "@/src/config/fonts";
import { Navbar } from "@/src/components/navbar";


import { config } from '@fortawesome/fontawesome-svg-core'
import '@fortawesome/fontawesome-svg-core/styles.css'
import { getMessages } from "next-intl/server";
import { NextIntlClientProvider } from "next-intl";
config.autoAddCss = false

export const metadata: Metadata = {
  title: {
    default: siteConfig.name,
    template: `%s - ${siteConfig.name}`,
  },
  description: siteConfig.description,
  icons: {
    icon: "/favicon.ico",
  },
};

export const viewport: Viewport = {
  themeColor: [
    { media: "(prefers-color-scheme: light)", color: "white" },
    { media: "(prefers-color-scheme: dark)", color: "black" },
  ],
};

export default async function RootLayout({
  children,
  params: {locale}
}: {
  children: React.ReactNode;
  params: {locale: string}
}) {
  const messages = await getMessages();
  return (
    <html suppressHydrationWarning lang={locale}>
      <body
        className={clsx(
          "min-h-screen bg-background font-sans antialiased",
          fontSans.variable,
        )}
      >
        <Providers themeProps={{ attribute: "class", defaultTheme: "dark" }}>
          <NextIntlClientProvider messages={messages}>
            <div className="relative flex flex-col h-fit bg-main light:bg-light overflow-x-hidden scrollbar-hide">
              <Navbar />
              <main className="container mx-auto max-w-fit flex-grow h-fit z-0 scrollbar-hide">
                {children}
              </main>
            </div>
          </NextIntlClientProvider>
        </Providers>
      </body>
    </html>
  );
}
prisma sonnet
#

Just for testing, can you comment the next intl and provders part & check if it is working?

topaz osprey
#

import "@/src/styles/globals.css";
import { Metadata, Viewport } from "next";
import { Link } from "@nextui-org/link";
import clsx from "clsx";

import { Providers } from "./providers";

import { siteConfig } from "@/src/config/site";
import { fontSans } from "@/src/config/fonts";
import { Navbar } from "@/src/components/navbar";


import { config } from '@fortawesome/fontawesome-svg-core'
import '@fortawesome/fontawesome-svg-core/styles.css'
import { getMessages } from "next-intl/server";
import { NextIntlClientProvider } from "next-intl";
config.autoAddCss = false

export const metadata: Metadata = {
  title: {
    default: siteConfig.name,
    template: `%s - ${siteConfig.name}`,
  },
  description: siteConfig.description,
  icons: {
    icon: "/favicon.ico",
  },
};

export const viewport: Viewport = {
  themeColor: [
    { media: "(prefers-color-scheme: light)", color: "white" },
    { media: "(prefers-color-scheme: dark)", color: "black" },
  ],
};

export default async function RootLayout({
  children,
  params: {locale}
}: {
  children: React.ReactNode;
  params: {locale: string}
}) {
  const messages = await getMessages();
  return (
    <html suppressHydrationWarning lang={locale}>
      <body
        className={clsx(
          "min-h-screen bg-background font-sans antialiased",
          fontSans.variable,
        )}
      >
        <Providers themeProps={{ attribute: "class", defaultTheme: "dark" }}>
        
            <div className="relative flex flex-col h-fit bg-main light:bg-light overflow-x-hidden scrollbar-hide">
              <Navbar />
              <main className="container mx-auto max-w-fit flex-grow h-fit z-0 scrollbar-hide">
                {children}
              </main>
            </div>
         
        </Providers>
      </body>
    </html>
  );
}

So like this?

prisma sonnet
#

Also providers

topaz osprey
#

That's NextJS

#

But wait lemme test

#

Nope

#

doesn't change anything

prisma sonnet
#

Can you provide a min repro repo? I'll check it when I'm free

prisma sonnet
#

Minimum Reproduction repository

topaz osprey
#

oh

prisma sonnet
topaz osprey
#

ye I can try

prisma sonnet
#

I'll check it out when I'm free

topaz osprey
#

Okay, I might want to go to sleep anyway lol

prisma sonnet
#

Same

topaz osprey
#

TLDR for anyone else joining;

I am using app directory for my NextJS + i18n routing project. When I try and build it, it will show this error:

> Export encountered errors on following paths:
        /_error: /404
        /_error: /500
        /_not-found/page: /_not-found

This shouldn't happen, as it is defined:
This is my current tree:

│   └───[locale]
│       ├───[...rest]
        ├───not-found.tsx (will not be found)
        ├───error.tsx (will not be found)
        ├───providers.tsx //NextJS Provider
        ├───layout.tsx //Root layout
        └───page.tsx //Root page
├───config
├───i18n
└───styles

If I put the error.tsx into the pages directory, the missing paths for the error go away:

│   └───[locale]
│       ├───[...rest]
        ├───not-found.tsx (will not be found)
        ├───error.tsx (Does not matter if this is here or not)
        ├───providers.tsx //NextJS provider
        ├───layout.tsx //Root layout
        └───page.tsx //Root page
├───config
├───pages
    _error.tsx (This is being found and will resolve the error)
├───i18n
└───styles

After this change, the build error is reduced to

> Export encountered errors on following paths:
        /_not-found/page: /_not-found
#

If I now try and put the _not-found.tsx into the pages directory, to resolve it the same way as _error.tsx, I get a conflict error while building;

│   └───[locale]
│       ├───[...rest]
        ├───not-found.tsx (will not be found)
        ├───error.tsx (Does not matter if this is here or not)
        ├───providers.tsx //NextJS provider
        ├───layout.tsx //Root layout
        └───page.tsx //Root page
├───config
├───pages
    _error.tsx (This is being found and will resolve the error)
    _not-found.tsx (This will produce the conflict)
├───i18n
└───styles
 ⨯   "pages/_not-found.tsx" - "next/dist/client/components/not-found-error"

It does not matter, how the code in the not-found is shaped, I get either a conflict or it not being found all the time.

#

Now on to some important files;
app/[locale]/layout.tsx (The main layout file)


import "@/src/styles/globals.css";
import { Metadata, Viewport } from "next";
import { Link } from "@nextui-org/link";
import clsx from "clsx";

import { Providers } from "./providers";

import { siteConfig } from "@/src/config/site";
import { fontSans } from "@/src/config/fonts";
import { Navbar } from "@/src/components/navbar";


import { config } from '@fortawesome/fontawesome-svg-core'
import '@fortawesome/fontawesome-svg-core/styles.css'
import { getMessages } from "next-intl/server";
import { NextIntlClientProvider } from "next-intl";
config.autoAddCss = false

export const metadata: Metadata = {
  title: {
    default: siteConfig.name,
    template: `%s - ${siteConfig.name}`,
  },
  description: siteConfig.description,
  icons: {
    icon: "/favicon.ico",
  },
};

export const viewport: Viewport = {
  themeColor: [
    { media: "(prefers-color-scheme: light)", color: "white" },
    { media: "(prefers-color-scheme: dark)", color: "black" },
  ],
};

export default async function RootLayout({
  children,
  params: {locale}
}: {
  children: React.ReactNode;
  params: {locale: string}
}) {
  const messages = await getMessages();
  return (
    <html suppressHydrationWarning lang={locale}>
      <body
        className={clsx(
          "min-h-screen bg-background font-sans antialiased",
          fontSans.variable,
        )}
      >
        <Providers themeProps={{ attribute: "class", defaultTheme: "dark" }}>
          <NextIntlClientProvider messages={messages}>
            <div className="relative flex flex-col h-fit bg-main light:bg-light overflow-x-hidden scrollbar-hide">
              <Navbar />
              <main className="container mx-auto max-w-fit flex-grow h-fit z-0 scrollbar-hide">
                {children}
              </main>
            </div>
          </NextIntlClientProvider>
        </Providers>
      </body>
    </html>
  );
}
#

root/next.config.js:

/** @type {import('next').NextConfig} */
const nextConfig = {}
const createNextIntlPlugin = require('next-intl/plugin');
const withNextIntl = createNextIntlPlugin();

const { webpack } = require("next/dist/compiled/webpack/webpack");
require('dotenv').config();
module.exports = withNextIntl({
  experimental: {
    missingSuspenseWithCSRBailout: false,
    turbo: {
      rules: {
        '*.svg': {
          loaders: ['@svgr/webpack', 'esbuild-loader'],
          as: '*.js',
        },
      },
    },
  },
  webpack: (config) => {
    config.plugins = config.plugins || [];
    config.plugins.push(
      new webpack.NormalModuleReplacementPlugin(/node:/, (resource) => {
        resource.request = resource.request.replace(/^node:/, "");
      }),
    );
    config.externals = {
      'next-intl': 'commonjs next-intl'
    }

    config.resolve.fallback = {
      ...config.resolve.fallback,async_hooks: false,
    }
    return config;
  },
});
#

Now normally I expect the error.tsx and the not-found.tsx in [locale] to be found. Putting them into the app/ directory will make them normal pages and I need to add a layout, after which they are not found still.

NextJS version: 14.2.5

What I might try when I wake up is;

Do I need getStaticProps in the error.tsx and not-found.tsx, in order them to be rendered as static pages?
Try to resolve the conflict somehow.

If anyone could point me in the right direction, that would be appreciated very much!

prisma sonnet
#

Thanks, checking it out

prisma sonnet
#

I have identified what the issue is.

So You'll need 2 not-found.tsx, one inside /app.

Since one is inside /app, a separate layout.tsx will be needed for that also

topaz osprey
prisma sonnet
#

I'll create a PR

#

@topaz osprey So after this, I saw the issue was still there.

The issue is with webpack config. If I comment it, build is running fine

#

-# app/not-found.tsx

'use client';
 
import Error from 'next/error';
import { redirect } from 'next/navigation';
 
export default function NotFound() {
  // redirect('/'); // Add this(if needed) after commenting use client and the return statement
  return ( 
    <html lang="en">
      <body>
        <Error statusCode={404} />
      </body>
    </html>
  );
}

-# app/layout.tsx

import React from "react";


export default async function RootLayout({ children } : { children: React.ReactNode}) {
    return (
        <>
        {children}
        </>
    )
}

Copy same error.tsx in app/ folder from app/[locale]

app/[locale]/not-found.tsx remains same

Comment WebPack config(to be fixed)

topaz osprey
topaz osprey
#

Nevermind I think I know what you mean, just tested it

#

Let me test on the full site to see if commenting webpack config is breaking

#

Solution builds on Vercel as well as on my machine, so change is not breaking. Thanks @prisma sonnet for your help and time, really appreciate it!
Marking the above answer as solution, the webpack config was an old fix and I suspect the fallback to have been the problem.