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'))
+ })
+ })
+})