NestJS使用EJS渲染文件报错及类型声明缺失问题求助
问题解决:NestJS中EJS渲染PDF的两类问题
一、修复TypeError: Cannot read properties of undefined (reading 'renderFile')错误
这个错误核心是EJS的导入方式不符合TypeScript模块解析规则,同时控制器异步逻辑处理存在漏洞,按以下步骤修复:
- 修正EJS导入方式
EJS采用CommonJS模块导出,TypeScript中需用命名空间导入才能获取完整方法集:
// 替换原 import ejs from 'ejs' import * as ejs from 'ejs';
- 修复控制器异步逻辑
原代码的立即执行异步函数无法将PDF结果返回给NestJS控制器,需将方法改为async函数并直接处理逻辑:
@Post() @Header('content-type', 'application/pdf') @Header('Content-Disposition', 'attachment; filename=invoice.pdf') // 添加async修饰符 async getPDFInvoice(@Body() user) { const userData = { firstname: "linus", lastname: "torvalds", email: "foo@bar.com", mob: "900-900-9000" }; let browser; try { browser = await puppeteer.launch({ headless: 'new' }); const [page] = await browser.pages(); // 建议用绝对路径避免文件找不到问题 const html = await ejs.renderFile("./invoice.ejs", { user: userData }); await page.setContent(html); const pdf = await page.pdf({ format: "A4" }); return pdf; } catch (err) { console.error(err); throw new HttpException('PDF生成失败', HttpStatus.INTERNAL_SERVER_ERROR); } finally { await browser?.close(); } }
可选优化:用path.resolve生成绝对路径,彻底避免工作目录差异导致的文件找不到问题:
import * as path from 'path'; // ... const html = await ejs.renderFile(path.resolve(__dirname, './invoice.ejs'), { user: userData });
二、解决VS Code找不到EJS声明文件的问题
已安装@types/ejs仍提示错误,检查以下配置:
- 确认
tsconfig.json的compilerOptions:- 确保
moduleResolution设置为node、node16或nodenext,适配模块解析规则; - 确保
types数组包含ejs,没有则添加:{ "compilerOptions": { // 其他配置... "types": ["ejs", "@nestjs/common"] } }
- 确保
- 重启VS Code的TypeScript服务:按
Ctrl+Shift+P(Windows)/Cmd+Shift+P(Mac),执行TypeScript: Restart TS Server; - 若版本不兼容,重新安装匹配的声明文件:
npm uninstall @types/ejs npm install --save-dev @types/ejs@latest
内容的提问来源于stack exchange,提问作者Jorge Loaiza
相关产品推荐
相关产品推荐

