{"id":"9efcb70f1d612355","repo":"vitejs/vite","slug":"cannot-print-server-urls-in-middleware-mode","errorCode":null,"errorMessage":"Cannot print server URLs in middleware mode.","messagePattern":"Cannot print server URLs in middleware mode\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/vite/src/node/server/index.ts","lineNumber":798,"sourceCode":"      } else {\n        server.config.logger.warn('No URL available to open in browser')\n      }\n    },\n    async close() {\n      if (!closeServerPromise) {\n        closeServerPromise = closeServer()\n      }\n      return closeServerPromise\n    },\n    printUrls() {\n      if (server.resolvedUrls) {\n        printServerUrls(\n          server.resolvedUrls,\n          serverConfig.host,\n          config.logger.info,\n        )\n      } else if (middlewareMode) {\n        throw new Error('Cannot print server URLs in middleware mode.')\n      } else {\n        throw new Error(\n          'Cannot print server URLs before server.listen is called.',\n        )\n      }\n    },\n    bindCLIShortcuts(options) {\n      bindCLIShortcuts(server, options)\n    },\n    async restart(forceOptimize?: boolean) {\n      if (!server._restartPromise) {\n        server._forceOptimizeOnRestart = !!forceOptimize\n        server._restartPromise = restartServer(server).finally(() => {\n          server._restartPromise = null\n          server._forceOptimizeOnRestart = false\n        })\n      }\n      return server._restartPromise","sourceCodeStart":780,"sourceCodeEnd":816,"githubUrl":"https://github.com/vitejs/vite/blob/89620f09afcfef6b35e7bb8660132ab5b4d0cd3b/packages/vite/src/node/server/index.ts#L780-L816","documentation":"ViteDevServer.printUrls at packages/vite/src/node/server/index.ts:798 throws in middleware mode (server.middlewareMode = true). In middleware mode Vite does not own the listening socket, so it cannot know the bound port/host and resolvedUrls stays null; printing URLs would be misleading.","triggerScenarios":"Calling server.printUrls() when the dev server was created with server.middlewareMode: true (common when mounting Vite inside an existing express/connect/Next.js server).","commonSituations":"SSR setups embedding Vite as middleware; custom servers (Polyserver, Nest, Fastify) wrapping Vite; copy-paste of the standalone printUrls call into a middleware-mode setup.","solutions":["Do not call printUrls() in middleware mode — the parent server is responsible for printing its own URLs.","If you want to advertise Vite, print the URL from the outer httpServer.listen callback using the host/port you control.","Drop server.middlewareMode if you want Vite to manage the socket and print URLs itself."],"exampleFix":"// before\nconst server = await createServer({ server: { middlewareMode: true } })\nserver.printUrls() // throws\n\n// after\nconst server = await createServer({ server: { middlewareMode: true } })\napp.use(server.middlewares)\nhttp.createServer(app).listen(3000, () =>\n  console.log('http://localhost:3000'),\n)","handlingStrategy":"validation","validationCode":"function assertNotMiddlewareMode(server: { middlewareMode?: boolean }) {\n  if (server.middlewareMode) {\n    throw new Error('printUrls is unavailable in middleware mode; the parent server owns the socket')\n  }\n}","typeGuard":"function isMiddlewareMode(server: { middlewareMode?: boolean }): boolean {\n  return !!server.middlewareMode\n}","tryCatchPattern":null,"preventionTips":["Do not call printUrls() in middleware mode; let the outer server print URLs.","Branch on middlewareMode before printing.","Drop middlewareMode if you want Vite to manage the socket and print URLs."],"tags":["dev-server","middleware-mode","printurls","config"],"analyzedSha":"89620f09afcfef6b35e7bb8660132ab5b4d0cd3b","analyzedAt":"2026-08-03T19:28:02.920Z","schemaVersion":2}