使用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,后续发邮件也会失败。
解决方法
- 调整邮件发送配置,修复路径问题和布局设置
如果你不需要全局公共布局,直接关闭默认布局即可,修改配置文件中的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' }));
- 修复控制器中的异步调用问题
把let player = super.store(req, res);修改为:
let player = await super.store(req, res);
确保能正确拿到创建后的player实例数据。
内容的提问来源于stack exchange,提问作者Crazy
相关产品推荐
相关产品推荐

