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

使用Nodemailer Express Handlebars发邮件时报ENOENT找不到main.handlebars错误

问题原因

核心报错原因

  • nodemailer-express-handlebars默认启用布局模板机制,默认会查找名为main.handlebars的全局布局文件,你既没有创建该文件也没有关闭布局功能,所以触发文件不存在报错。
  • 你配置的viewPath使用了相对路径src/mails/templates,相对路径会基于Node进程启动的工作目录定位,若启动目录不是项目根目录就会出现路径偏移,你报错中的查找路径直接指向项目根目录下的main.handlebars就是路径定位错误导致的。
  • 控制器中调用父类super.store方法时没有加await,得到的player是Pending状态的Promise,直接取player.email会得到undefined,后续发邮件也会失败。
解决方法
  1. 调整邮件发送配置,修复路径问题和布局设置
    如果你不需要全局公共布局,直接关闭默认布局即可,修改配置文件中的mailerhbs初始化代码如下:
Mail.use('compile', mailerhbs({
    viewPath: path.resolve('src/mails/templates'), // 用path.resolve生成绝对路径,避免路径偏移
    extName: '.hbs',
    defaultLayout: false // 关闭默认布局,不再查找main.handlebars文件
}));

如果你需要使用公共布局,就创建src/mails/layouts/main.handlebars作为全局布局文件,同时补充布局目录配置:

Mail.use('compile', mailerhbs({
    viewPath: path.resolve('src/mails/templates'),
    layoutsDir: path.resolve('src/mails/layouts'), // 布局文件存放目录
    defaultLayout: 'main', // 指定默认布局文件名
    extName: '.hbs'
}));
  1. 修复控制器中的异步调用问题
    把let player = super.store(req, res);修改为:
let player = await super.store(req, res);

确保能正确拿到创建后的player实例数据。

内容的提问来源于stack exchange,提问作者Crazy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:06:07