我正在尝试通过HTML模板发送电子邮件,该模板位于名为“ view”的文件夹下的同一路径中。 html模板名称为“ index.handlebars”。尽管我认为路径是绝对正确的,但这给了路径一些奇怪的错误。 谁能帮我解决这个问题。
TypeError [ERR_INVALID_ARG_TYPE]:“ path”参数必须为字符串类型。接收类型未定义 在validateString(internal / validators.js:125:11) 在Object.resolve(path.js:161:7) 在ExpressHandlebars._resolveLayoutPath上(E:\ NODE JS EXAMPLES \ node-practice-one \ node_modules \ express-handlebars \ lib \ express-handlebars.js:342:17) 在ExpressHandlebars。 (E:\ NODE JS EXAMPLES \ node-practice-one \ node_modules \ express-handlebars \ lib \ express-handlebars.js:223:35)
const express = require('express');
const path = require('path');
const nodemailer = require('nodemailer');
const hbs = require('nodemailer-handlebars');
const log = console.log;
// Step 1
let transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: process.env.EMAIL || 'abcd@gmail.com', // TODO: your gmail account
pass: process.env.PASSWORD || 'abcd' // TODO: your gmail password
}
});
router.post('/send_mail', (req, res, next) => {
// Step 2
transporter.use(
'compile',
hbs({
viewEngine: 'express-handlebars',
viewPath: './views/'
})
);
// Step 3
let mailOptions = {
from: 'xxx@gmail.com', // TODO: email sender
to: 'yyy@gmail.com', // TODO: email receiver
subject: 'Nodemailer - Test',
text: 'Wooohooo it works!!',
template: 'index',
context: {
name: 'test user'
} // send extra values to template
};
// Step 4
transporter.sendMail(mailOptions, (err, data) => {
console.log(err);
if (err) {
return log('Error occurs');
}
return log('Email sent!!!');
});
});
请建议我,我该怎么办才能纠正错误。
答案 0 :(得分:0)
在hbs选项内,您没有提及包含layout.hbs的layoutsDir
layout.hbs保留默认的HTML框架,这是将由所有其他视图文件扩展的文件。默认情况下,“视图”文件夹中的文件将使用此基本框架,然后在此{{{body}}}部分中呈现其特定内容。这是其他视图进入并渲染其内容的地方。
hbs({
defaultLayout: "layout",
extname: ".hbs",
layoutsDir: __dirname + "/views/layouts",
partialsDir: __dirname + "/views/partials"})
然后在views文件夹内创建layouts文件夹和partials文件夹。在layouts目录中创建layout.hbs。在此文件内插入一个基本的html骨架,然后将其放置在正文中
{{{body}}}