vitejs/vite · error · Error

Cannot print server URLs in middleware mode.

Error message

Cannot print server URLs in middleware mode.

What it means

Thrown by server.printUrls() when the server has no resolvedUrls and was started in middleware mode. In middleware mode Vite does not own an HTTP listener, so it cannot know which host/port the parent server uses, and there is nothing meaningful to print.

Solutions

  1. Remove the printUrls() call in middleware mode — log the URL from your own HTTP server instead.
  2. If you still want Vite-style output, compute the URL from your parent server's address and print it yourself.
  3. Switch out of middleware mode (remove server.middlewareMode) if you want Vite to own the listener and print URLs.

Example fix

// before
const vite = await createServer({ server: { middlewareMode: true } })
vite.printUrls() // throws
// after
const vite = await createServer({ server: { middlewareMode: true } })
app.use(vite.middlewares)
// print the parent server URL yourself once app.listen completes
Defensive patterns

Strategy: validation

Validate before calling

if (!server.config.server.middlewareMode) {
  server.printUrls()
}

Prevention

When it happens

Trigger: Calling server.printUrls() on a server created with server.middlewareMode: true (or the express/connect middleware form). resolvedUrls stays empty because Vite never bound a port; the check is at server/index.ts:797-798.

Common situations: Following a standalone-server tutorial (which calls printUrls) while integrating Vite as middleware inside Express/Connect/Next. Copying the default server startup snippet into a custom server bootstrap.

Related errors


AI-assisted analysis of vitejs/vite@b4d66fee14 (2026-08-11). Data as JSON: /api/errors/9efcb70f1d612355. Report an issue: GitHub.

Appendix: source

Thrown at packages/vite/src/node/server/index.ts:798

      } else {
        server.config.logger.warn('No URL available to open in browser')
      }
    },
    async close() {
      if (!closeServerPromise) {
        closeServerPromise = closeServer()
      }
      return closeServerPromise
    },
    printUrls() {
      if (server.resolvedUrls) {
        printServerUrls(
          server.resolvedUrls,
          serverConfig.host,
          config.logger.info,
        )
      } else if (middlewareMode) {
        throw new Error('Cannot print server URLs in middleware mode.')
      } else {
        throw new Error(
          'Cannot print server URLs before server.listen is called.',
        )
      }
    },
    bindCLIShortcuts(options) {
      bindCLIShortcuts(server, options)
    },
    async restart(forceOptimize?: boolean) {
      if (!server._restartPromise) {
        server._forceOptimizeOnRestart = !!forceOptimize
        server._restartPromise = restartServer(server).finally(() => {
          server._restartPromise = null
          server._forceOptimizeOnRestart = false
        })
      }
      return server._restartPromise

View on GitHub (pinned to b4d66fee14)