Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(next): Do not display message when middleware is removed on dev mode #39604

Merged
merged 10 commits into from Aug 20, 2022
1 change: 0 additions & 1 deletion packages/next/server/next-server.ts
Expand Up @@ -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 }
}

Expand Down
9 changes: 9 additions & 0 deletions 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
}
9 changes: 9 additions & 0 deletions test/integration/middleware-dev-update/pages/index.js
@@ -0,0 +1,9 @@
export default (props) => <div id="from-middleware">{props.fromMiddleware}</div>

export async function getServerSideProps({ res }) {
return {
props: {
fromMiddleware: res.getHeader('x-from-middleware') || '',
},
}
}
125 changes: 125 additions & 0 deletions 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'))
})
})
})