Node.js NodeEmailer express Handlebar |错误:eNote:没有用于模板的此类文件或目录
我遇到一个问题,NodeEmailer express Handlebar输出错误:Node.js NodeEmailer express Handlebar |错误:eNote:没有用于模板的此类文件或目录,node.js,express,handlebars.js,nodemailer,express-handlebars,Node.js,Express,Handlebars.js,Nodemailer,Express Handlebars,我遇到一个问题,NodeEmailer express Handlebar输出错误: [Error: ENOENT: no such file or directory, open ''] { errno: -2, code: 'ENOENT', syscall: 'open', path: '/Users/person/Code/app/api/controllers/templates/undefined.hbs' 我的设置如下: const handlebarOptio
[Error: ENOENT: no such file or directory, open ''] {
errno: -2,
code: 'ENOENT',
syscall: 'open',
path: '/Users/person/Code/app/api/controllers/templates/undefined.hbs'
我的设置如下:
const handlebarOptions = {
viewEngine: {
extName: ".hbs",
partialsDir: path.resolve(__dirname, "templates"),
defaultLayout: false
},
viewPath: path.resolve(__dirname, "templates"),
extName: ".hbs"
};
transporter.use('compile', hbs(handlebarOptions));
并通过以下方式发送电子邮件:
let mailOptions = await transporter.sendMail({
from: '"Test - No Reply" <test@test.com>'
to: 'someEmail@gmail.com,
subject: "Hello ✔",
template: 'welcome',
});
let mailpoptions=wait transporter.sendMail({
发件人:“‘测试—无应答’”
致:'someEmail@gmail.com,
主题:“你好✔",
模板:“欢迎”,
});
奇怪的是,我仍然收到电子邮件,尽管它说找不到文件。我如何解决这个错误,让NodeEmailer express Handlebar不将文件视为“undefined.hbs”
更新:
我在NodeEmailer中将“welcome”改为“welcome.hbs”,现在的错误是找不到“welcome.hbs.hbs”。这是有道理的,您可能会认为解决方案是删除“.hbs”并使其成为“welcome”,但我们回到了最初的错误“undefined.hbs”
另外,如果我将模板更改为“welcome2”,它会说它找不到“welcome2.hbs”。这很奇怪……似乎只有当模板文件与文件名匹配时,它才变得未定义,而文件名是它应该的。它不应该是模板属性,而应该是sendMail对象中的html属性:
let mailOptions = await transporter.sendMail({
from: '"Test - No Reply" <test@test.com>'
to: 'someEmail@gmail.com,
subject: "Hello ✔",
html: './templates/welcome.hbs',
});
let mailpoptions=wait transporter.sendMail({
发件人:“‘测试—无应答’”
致:'someEmail@gmail.com,
主题:“你好✔",
html:“./templates/welcome.hbs”,
});
回答我自己的问题。问题似乎与使其成为带有回调的异步函数有关,这导致了某种类型的未定义问题
有关代码参考的深入解答,您可以在此处看到解决方案:我的解决方案是:
const path = require('path')
const nodemailer = require('nodemailer');
const hbs = require('nodemailer-express-handlebars')
const { host, port, user, pass } = require('../config/mail.json')
var transport = nodemailer.createTransport({
host,
port,
auth: { user, pass },
});
const handlebarOptions = {
viewEngine: {
extName: ".html",
partialsDir: path.resolve('./src/resources/mail'),
defaultLayout: false,
},
viewPath: path.resolve('./src/resources/mail'),
extName: ".html",
};
transport.use('compile', hbs(handlebarOptions));
module.exports = transport;
const handlebarOptions = {
viewEngine: {
extName: ".html",
partialsDir: path.resolve('./src/resources/mail'),
defaultLayout: false,
},
viewPath: path.resolve('./src/resources/mail'),
extName: ".html",
};
我的项目中的模板文件夹是:“src/resources/mail”
我的模板文件是“auth/forget\u password.html”
在我的项目中,把手选项的配置出现了一个问题,解决方案是:
const path = require('path')
const nodemailer = require('nodemailer');
const hbs = require('nodemailer-express-handlebars')
const { host, port, user, pass } = require('../config/mail.json')
var transport = nodemailer.createTransport({
host,
port,
auth: { user, pass },
});
const handlebarOptions = {
viewEngine: {
extName: ".html",
partialsDir: path.resolve('./src/resources/mail'),
defaultLayout: false,
},
viewPath: path.resolve('./src/resources/mail'),
extName: ".html",
};
transport.use('compile', hbs(handlebarOptions));
module.exports = transport;
const handlebarOptions = {
viewEngine: {
extName: ".html",
partialsDir: path.resolve('./src/resources/mail'),
defaultLayout: false,
},
viewPath: path.resolve('./src/resources/mail'),
extName: ".html",
};
该位置是否存在welcome.hbs文件?是的。可以确认/Users/person/Code/app/templates/包含“welcome.hbs”好的。我认为它无法获取文件路径,因为您正在使用NodeEmailer的手柄。请尝试更改html属性值的路径,并将其设置为html属性而不是模板属性,在上面的co中de it仍然将模板显示为sendMail()中的属性我在NodeEmailer中将“welcome”改为“welcome.hbs”,现在的错误是找不到“welcome.hbs.hbs”。这是有道理的,您会认为解决方案是删除“.hbs”并使其成为“welcome”,但我们又回到了“undefined.hbs”的原始错误。这是否让您了解您认为问题是什么?另外,如果我将模板改为“welcome2”,它说它找不到“welcome2.hbs”。这很奇怪……好像只有当模板文件与文件名匹配时它才变得未定义,这是它应该是的。不幸的是,这仍然会导致相同的错误,但发送的电子邮件的正文也是文本字符串。“/templates/welcome.hbs”。请使用它所在的路径,或者尝试>欢迎您也缺少partialsDir:\uu dirname+“/templates”在选项对象中我用partialsDir更新了我的问题。不幸的是,我仍然收到相同的问题!这解决了我的问题