{"record":{"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/b4d66fee14d970f45b8a6f3d7d6aee73ca9b88ab/packages/vite/src/node/server/index.ts#L780-L816","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Remove the printUrls() call in middleware mode — log the URL from your own HTTP server instead.","If you still want Vite-style output, compute the URL from your parent server's address and print it yourself.","Switch out of middleware mode (remove server.middlewareMode) if you want Vite to own the listener and print URLs."],"exampleFix":"// before\nconst vite = await createServer({ server: { middlewareMode: true } })\nvite.printUrls() // throws\n// after\nconst vite = await createServer({ server: { middlewareMode: true } })\napp.use(vite.middlewares)\n// print the parent server URL yourself once app.listen completes","handlingStrategy":"validation","validationCode":"if (!server.config.server.middlewareMode) {\n  server.printUrls()\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Skip printUrls() in middleware mode; log the URL from your parent HTTP server.","Wrap printUrls in a helper that checks middlewareMode first."],"tags":["dev-server","middleware-mode","urls"],"backgroundTag":null,"analyzedSha":"b4d66fee14d970f45b8a6f3d7d6aee73ca9b88ab","analyzedAt":"2026-08-11T11:49:19.515Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}