node.js,表示:发送带有“ nodemailer”和“ nodemailer-handlebars”的电子邮件,并给出TypeError [ERR_INVALID_ARG_TYPE]:

时间:2019-06-15 16:55:25

标签: node.js express nodemailer

我正在尝试通过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!!!');
  });
});

请建议我,我该怎么办才能纠正错误。

1 个答案:

答案 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}}}