From ea7efcb05c421f00b039b9b629b87149b4a9d0b5 Mon Sep 17 00:00:00 2001 From: Naoyuki Kanezawa Date: Sat, 20 Aug 2022 20:46:59 +0700 Subject: [PATCH] fix(next): Do not display message when middleware is removed on dev mode (#39604) Fixes https://github.com/vercel/next.js/issues/39532 ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have helpful link attached, see `contributing.md` --- packages/next/server/next-server.ts | 1 - .../middleware-dev-update/middleware.js | 9 ++ .../middleware-dev-update/pages/index.js | 9 ++ .../middleware-dev-update/test/index.test.js | 125 ++++++++++++++++++ 4 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 test/integration/middleware-dev-update/middleware.js create mode 100644 test/integration/middleware-dev-update/pages/index.js create mode 100644 test/integration/middleware-dev-update/test/index.test.js diff --git a/packages/next/server/next-server.ts b/packages/next/server/next-server.ts index f0e869773d0cabd..26aafbee55c36e8 100644 --- a/packages/next/server/next-server.ts +++ b/packages/next/server/next-server.ts @@ -1636,7 +1636,6 @@ export default class NextNodeServer extends BaseServer { return { finished: false } } if (!(await this.hasMiddleware(middleware.page))) { - console.warn(`The Edge Function for ${middleware.page} was not found`) return { finished: false } } diff --git a/test/integration/middleware-dev-update/middleware.js b/test/integration/middleware-dev-update/middleware.js new file mode 100644 index 000000000000000..f71c421319fb66a --- /dev/null +++ b/test/integration/middleware-dev-update/middleware.js @@ -0,0 +1,9 @@ +import { NextResponse } from 'next/server' + +export function middleware(request) { + if (request.nextUrl.pathname.startsWith('/_next/')) return + + const res = NextResponse.rewrite(new URL('/', request.url)) + res.headers.set('X-From-Middleware', 'true') + return res +} diff --git a/test/integration/middleware-dev-update/pages/index.js b/test/integration/middleware-dev-update/pages/index.js new file mode 100644 index 000000000000000..c37edc772d0e0ac --- /dev/null +++ b/test/integration/middleware-dev-update/pages/index.js @@ -0,0 +1,9 @@ +export default (props) =>
{props.fromMiddleware}
+ +export async function getServerSideProps({ res }) { + return { + props: { + fromMiddleware: res.getHeader('x-from-middleware') || '', + }, + } +} diff --git a/test/integration/middleware-dev-update/test/index.test.js b/test/integration/middleware-dev-update/test/index.test.js new file mode 100644 index 000000000000000..d6a57486874587a --- /dev/null +++ b/test/integration/middleware-dev-update/test/index.test.js @@ -0,0 +1,125 @@ +import { + fetchViaHTTP, + File, + findPort, + killApp, + launchApp, + retry, +} from 'next-test-utils' +import { join } from 'path' +import webdriver from 'next-webdriver' + +const context = { + appDir: join(__dirname, '../'), + logs: { output: '', stdout: '', stderr: '' }, + middleware: new File(join(__dirname, '../middleware.js')), +} + +describe('Middleware development errors', () => { + beforeEach(async () => { + context.logs = { output: '', stdout: '', stderr: '' } + context.appPort = await findPort() + context.app = await launchApp(context.appDir, context.appPort, { + onStdout(msg) { + context.logs.output += msg + context.logs.stdout += msg + }, + onStderr(msg) { + context.logs.output += msg + context.logs.stderr += msg + }, + }) + }) + + afterEach(() => { + context.middleware.restore() + if (context.app) { + killApp(context.app) + } + }) + + async function assertMiddlewareFetch(hasMiddleware, path = '/') { + const res = await fetchViaHTTP(context.appPort, path) + expect(res.status).toBe(200) + expect(res.headers.get('x-from-middleware')).toBe( + hasMiddleware ? 'true' : null + ) + } + + async function assertMiddlewareRender(hasMiddleware, path = '/') { + const browser = await webdriver(context.appPort, path) + const fromMiddleware = await browser.elementById('from-middleware').text() + expect(fromMiddleware).toBe(hasMiddleware ? 'true' : '') + } + + describe('when middleware is removed', () => { + beforeEach(async () => { + await assertMiddlewareFetch(true) + context.middleware.delete() + }) + + it('sends response correctly', async () => { + await assertMiddlewareFetch(false) + await assertMiddlewareRender(false) + + // assert no extra message on stderr + expect(context.logs.stderr).toBe('') + }) + }) + + describe('when middleware is removed and re-added', () => { + beforeEach(async () => { + await assertMiddlewareFetch(true) + context.middleware.delete() + await assertMiddlewareFetch(false) + context.middleware.restore() + }) + + it('sends response correctly', async () => { + await assertMiddlewareFetch(true) + await assertMiddlewareRender(true) + }) + }) + + describe('when middleware is added', () => { + beforeEach(async () => { + context.middleware.delete() + await assertMiddlewareFetch(false) + context.middleware.restore() + }) + + it('sends response correctly', async () => { + await retry(() => assertMiddlewareFetch(true)) + await assertMiddlewareRender(true) + }) + }) + + describe('when matcher is added', () => { + beforeEach(async () => { + context.middleware.write( + context.middleware.originalContent + + ` + export const config = { + matcher: '/', + } + ` + ) + + await assertMiddlewareFetch(true) + + context.middleware.write( + context.middleware.originalContent + + ` + export const config = { + matcher: '/asdf', + } + ` + ) + }) + + it('sends response correctly', async () => { + await retry(() => assertMiddlewareFetch(true, '/asdf')) + await retry(() => assertMiddlewareRender(true, '/asdf')) + }) + }) +})