Skip to content

Commit

Permalink
fix(next): Do not display message when middleware is removed on dev m…
Browse files Browse the repository at this point in the history
…ode (#39604)

Fixes #39532

## Bug

- [ ] Related issues linked using `fixes #number`
- [ ] Integration tests added
- [ ] Errors have helpful link attached, see `contributing.md`
  • Loading branch information
nkzawa committed Aug 20, 2022
1 parent 72fd04a commit ea7efcb
Show file tree
Hide file tree
Showing 4 changed files with 143 additions and 1 deletion.
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'))
})
})
})

0 comments on commit ea7efcb

Please sign in to comment.