#javascript #node.js #express #handlebars.js #nodemailer
#javascript #node.js #экспресс #handlebars.js #nodemailer
Вопрос:
У меня возникла проблема, и я не могу понять, что именно я делаю неправильно. Когда я запускаю свой код, я получаю эту ошибку:
[Error: ENOENT: no such file or directory, open 'C:UsersAlexDesktopemailtestmain.handlebars'] { errno: -4058, code: 'ENOENT', syscall: 'open', path: 'C:\Users\Alex\Desktop\emailtest\main.handlebars' }
Вот мой код:
const nodemailer = require("nodemailer");
const hbs = require("nodemailer-express-handlebars");
const express = require("express");
const app = express();
const port = 3000;
const transporter = nodemailer.createTransport({
service: "gmail",
auth: {
user: "useremail",
pass: "userpassword",
},
// tls: {
// rejectUnauthorized: false,
// },
});
transporter.use(
"compile",
hbs({
viewEngine: "express-handlebars",
viewPath: "views",
})
);
const mailOptions = {
from: "myemailhere",
to: "receiverpassword",
subject: "Automated Email",
template: "index",
};
transporter.sendMail(mailOptions, function (error, info) {
if (error) {
console.log(error);
} else {
console.log("Email sent: " info.response);
}
});
app.listen(port, () => {
console.log(
`Listening at http://localhost:${port}`
);
});
Структура папок:
server.js
views
-index.handlebars
Без использования Handlebars я могу отправлять электронные письма просто отлично, но поскольку мне нужен способ динамического заполнения HTML, я думаю, что Handlebars был бы лучшим вариантом, если бы я мог просто заставить его работать. Любая информация была бы отличной, заранее спасибо!
Комментарии:
1. Попробуйте передать полный путь? Просто мысль.
2. @AbrahamLabkovsky К сожалению, я уже пробовал это, спасибо
3. Кроме того,
viewEngine
это не строка. Это либо экземпляр express-handlebars, либо объект options. Вы также можете определить свой каталог макетов там. Не уверен, что именно заставляет его использовать местоположение по умолчанию, но я бы порылся там
Ответ №1:
const path = require('path');
const handlebarOptions = {
viewEngine: {
extName: ".handlebars",
partialsDir: path.resolve(__dirname, "views"),
defaultLayout: false,
},
viewPath: path.resolve(__dirname, "views"),
extName: ".handlebars",
};
trasnporter.use('compile', hbs(handlebarOptions));