payloadcms / payload

Payload is the open-source, fullstack Next.js framework, giving you instant backend superpowers. Get a full TypeScript backend and admin panel instantly. Use Payload as a headless CMS or for building powerful applications.
https://payloadcms.com
MIT License
28.28k stars 1.75k forks source link

Next.js Middleware not working in Custom Server example after build process #6946

Open sebastianpulak opened 5 months ago

sebastianpulak commented 5 months ago

Link to reproduction

No response

Describe the Bug

I've cloned a ecommerce template (https://github.com/payloadcms/payload/tree/main/templates/ecommerce) to start working on a Next.js project. When I added a simple middleware as you often do in Next.js applications, it only runs on development using yarn dev but after building the project using yarn build && yarn serve it no longer works - it's not fired.

My middleware.ts file is placed inside /src folder and looks like this:

import type { NextRequest } from 'next/server'
import { NextResponse } from 'next/server'

// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function middleware(request: NextRequest) {
  // eslint-disable-next-line no-console
  console.log('middleware hit: ', request.url)
  return NextResponse.next()
}

export const config = {
  matcher: [
    '/((?!api|_next/static|_next/image|favicon.ico|favicon.svg|icon.png|sitemap.xml|robots.txt).*)',
  ],
}

Development: image

After building the project it no longer fires (console.log is not visible).

Any idea how to make middleware work with Custom server?

To Reproduce

  1. Clone the ecommerce template https://github.com/payloadcms/payload/tree/main/templates/ecommerce by running command npx create-payload-app@latest my-project -t ecommerce
  2. Add a middleware.ts file inside src/ folder (same level as server.ts file) with following content:
import type { NextRequest } from 'next/server'
import { NextResponse } from 'next/server'

// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function middleware(request: NextRequest) {
  // eslint-disable-next-line no-console
  console.log('middleware hit: ', request.url)
  return NextResponse.next()
}

export const config = {
  matcher: [
    '/((?!api|_next/static|_next/image|favicon.ico|favicon.svg|icon.png|sitemap.xml|robots.txt).*)',
  ],
}
  1. Run yarn build && yarn serve
  2. Visit http://localhost:3000

You won't be able to see a console.log inside a middleware file as opposite to running a project by yarn dev

Payload Version

2.22.0

Adapters and Plugins

No response

omonina commented 4 months ago

I am coping with similar thing. Support - any luck with reproducing this issue?

denolfe commented 3 months ago

@sebastianpulak Looking into recreating this issue now.

denolfe commented 3 months ago

I was able to recreate this issue but have not been able to pinpoint a cause. A blank Next.js app of the same version does not have this issue. It likely has something to do with how we are invoking the nextBuild command.

MauriceMarkslag commented 2 weeks ago

@denolfe Hey Elliot, has there been any progress/updates regarding this issue? We are running into the exact same problem. Thanks in advance!