{"record":{"id":"69b57a924b474f6c","repo":"vitejs/vite","slug":"cannot-print-server-urls-before-server-listen-is-c","errorCode":null,"errorMessage":"Cannot print server URLs before server.listen is called.","messagePattern":"Cannot print server URLs before server\\.listen is called\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/vite/src/node/server/index.ts","lineNumber":800,"sourceCode":"      }\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\n    },\n","sourceCodeStart":782,"sourceCodeEnd":818,"githubUrl":"https://github.com/vitejs/vite/blob/b4d66fee14d970f45b8a6f3d7d6aee73ca9b88ab/packages/vite/src/node/server/index.ts#L782-L818","documentation":"Thrown by server.printUrls() when the server is not in middleware mode but resolvedUrls is still empty — which only happens before the HTTP server has been told to listen. resolvedUrls is populated during server.listen(), so calling printUrls earlier has nothing to print.","triggerScenarios":"Calling server.printUrls() before awaiting server.listen(). The branch at server/index.ts:800 fires because resolvedUrls is undefined at that point.","commonSituations":"Reordering startup code so printUrls runs before listen. Forgetting to await listen() in an async bootstrap. Calling printUrls inside a configureServer hook that runs during creation.","solutions":["Call printUrls() only after await server.listen() has resolved.","Move the printUrls call into the listen callback / after the await.","If you use server.listen(callback) form, call printUrls inside the callback."],"exampleFix":"// before\nconst server = await createServer(cfg)\nserver.printUrls()          // throws\nawait server.listen(5173)\n// after\nconst server = await createServer(cfg)\nawait server.listen(5173)\nserver.printUrls()","handlingStrategy":"validation","validationCode":"// only call after listen resolves\nawait server.listen()\nserver.printUrls()","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Call printUrls() inside the resolved listen() promise chain.","Treat printUrls as a post-listen step in your startup checklist."],"tags":["dev-server","lifecycle","urls"],"backgroundTag":null,"analyzedSha":"b4d66fee14d970f45b8a6f3d7d6aee73ca9b88ab","analyzedAt":"2026-08-11T11:49:19.515Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}