NestJS Monorepo微服务EJS视图查找失败问题求助
问题排查与解决方案
核心问题分析
报错显示在dist/apps/views找不到index.ejs,本质是两个问题:
- TypeScript编译时仅处理
.ts文件,.ejs模板未被同步到dist目录对应位置 - 运行时的路径配置基于编译后的文件位置,原相对路径指向错误
具体解决步骤
1. 配置Nest CLI自动复制模板文件
在项目根目录的nest-cli.json中,针对fin服务添加静态资源复制规则,确保编译时把.ejs文件同步到dist目录:
{ "$schema": "https://json.schemastore.org/nest-cli", "monorepo": true, "root": "apps/fin", "projects": { "fin": { "root": "apps/fin", "sourceRoot": "apps/fin/src", "compilerOptions": { "assets": ["views/**/*.ejs"], "watchAssets": true } } } }
assets:指定要复制的静态资源路径,views/**/*.ejs表示匹配views目录下所有.ejs文件watchAssets:开启后,开发模式下修改模板文件会自动同步到dist,无需重启服务
2. 修正视图目录的路径配置
原代码中resolve('../src/views')是基于源码位置的相对路径,但编译后main.js位于dist/apps/fin/src目录,相对路径指向会出错。改用__dirname(当前文件的绝对路径)来定位视图目录:
import { NestFactory } from '@nestjs/core'; import { NestExpressApplication } from '@nestjs/platform-express'; import { resolve } from 'path'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create<NestExpressApplication>(AppModule); // 修正静态资源路径(如果有assets目录的话) app.useStaticAssets(resolve(__dirname, 'assets')); // 修正视图目录路径 app.setBaseViewsDir(resolve(__dirname, 'views')); app.setViewEngine('ejs'); await app.listen(6006); console.log(`Fin PEN started successfully on Port 6006`); } bootstrap();
__dirname会指向编译后main.js所在的dist/apps/fin/src目录,搭配resolve就能准确找到复制过来的views文件夹。
3. 验证配置
执行编译命令:
npm run build
查看dist/apps/fin/src目录下是否存在views文件夹及index.ejs文件,确认文件已被正确复制后,启动服务:
npm run start:dev fin
内容的提问来源于stack exchange,提问作者Vakindu
相关产品推荐
相关产品推荐

