You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS使用EJS渲染文件报错及类型声明缺失问题求助

问题解决:NestJS中EJS渲染PDF的两类问题

一、修复TypeError: Cannot read properties of undefined (reading 'renderFile')错误

这个错误核心是EJS的导入方式不符合TypeScript模块解析规则,同时控制器异步逻辑处理存在漏洞,按以下步骤修复:

  1. 修正EJS导入方式
    EJS采用CommonJS模块导出,TypeScript中需用命名空间导入才能获取完整方法集:
// 替换原 import ejs from 'ejs'
import * as ejs from 'ejs';
  1. 修复控制器异步逻辑
    原代码的立即执行异步函数无法将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 07:52:42