基于既有HapiJS服务器的TSOA路由与API规格构建时机咨询
在HapiJS中集成TSOA的最优方案
1. 命令串联方案(你的提问中方案完全可行)
tsoa spec-and-routes && node bin/node 是直接有效的解决方式——通过&&确保TSOA成功生成routes.ts和swagger.json后,再启动Node进程,从根源避免文件未生成就被导入的报错。
推荐把这个命令封装到package.json的scripts中,方便日常调用:
{ "scripts": { "start": "tsoa spec-and-routes && node bin/node", "dev": "tsoa spec-and-routes && nodemon bin/node", // 开发环境配合nodemon自动重启 "build": "tsoa spec-and-routes && tsc" // 若用TypeScript编译,先生成再编译代码 } }
2. 程序化生成+动态导入方案(满足程序化生成需求)
静态import会在代码执行前解析模块,导致未生成的routes.ts触发报错,改用动态导入配合TSOA的程序化API即可解决:
步骤1:在启动逻辑中集成生成流程
import Hapi from '@hapi/hapi'; import { generateRoutes, generateSpec } from 'tsoa'; import tsoaConfig from './tsoa.json'; // 你的TSOA配置文件 async function bootstrapServer() { // 先程序化生成路由和Swagger文档 await generateSpec(tsoaConfig); await generateRoutes(tsoaConfig); // 动态导入生成的路由注册函数(此时文件已存在) const { default: RegisterRoutes } = await import('../build/routes'); // 初始化Hapi服务器 const server = Hapi.server({ port: process.env.PORT || 3000, host: '0.0.0.0' }); // 注册TSOA路由 RegisterRoutes(server); // 启动服务器 await server.start(); console.log(`Server running at: ${server.info.uri}`); } bootstrapServer().catch(err => { console.error('Server startup failed:', err); process.exit(1); });
步骤2:配置注意事项
- 确保
tsoa.json中的routes.outDir和spec.outDir配置正确,指向你期望生成文件的目录。 - TypeScript项目需在
tsconfig.json中包含生成目录,避免编译报错:
{ "include": ["src/**/*", "build/**/*"] }
3. 生产环境优化建议
生产环境下建议提前预先生成routes.ts和swagger.json,而非每次启动服务器时生成,可提升启动速度:
{ "scripts": { "prestart:prod": "tsoa spec-and-routes", "start:prod": "node bin/node" } }
执行npm run start:prod时,会自动先执行prestart:prod中的生成命令,再启动服务器。
内容的提问来源于stack exchange,提问作者kenwilde
相关产品推荐
相关产品推荐

