【问题标题】:node.js, express: send email with 'nodemailer' and 'nodemailer-handlebars' giving TypeError [ERR_INVALID_ARG_TYPE]:node.js,快递:发送带有“nodemailer”和“nodemailer-handlebars”的电子邮件,给出 TypeError [ERR_INVALID_ARG_TYPE]:
【发布时间】:2019-06-15 16:55:25
【问题描述】:

我正在尝试通过 HTML 模板发送电子邮件,该模板位于名为“view”的文件夹下的同一路径中。 HTML 模板名称是“index.handlebars”。但它给出了一些奇怪的路径错误,尽管我认为路径是绝对正确的。 谁能帮我解决这个问题?

TypeError [ERR_INVALID_ARG_TYPE]:“路径”参数必须是字符串类型。接收类型未定义 在 validateString (internal/validators.js:125:11) 在 Object.resolve (path.js:161:7) 在 ExpressHandlebars._resolveLayoutPath (E:\NODE JS 示例\node-practice-one\node_modules\express-handlebars\lib\express-handlebars.js:342:17) 在 ExpressHandlebars。 (E:\NODE JS 示例\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!!!');
  });
});

请给我建议,我应该怎么做才能修复错误。

【问题讨论】:

  • 您应该使用(我认为)nodemailer-express-handlebars https://www.npmjs.com/package/nodemailer-express-handlebars,因为您使用的软件包已被弃用。 github页面指向nodemailer-express-handlebars
  • @AritraChakraborty:我也用“nodemailer-express-handlebars”包进行了测试,但它也给出了错误。错误:部分目录必须是字符串或配置对象
  • 我已经用 'nodemailer-express-handlebars' 包解决了上述问题。有人在此链接中发布了答案,它对我有用。 github.com/yads/nodemailer-express-handlebars/issues/22

标签: javascript node.js express handlebars.js nodemailer


【解决方案1】:

在 hbs 选项中你没有提到包含 layout.hbs 的 layoutsDir

layout.hbs 包含默认的 HTML 框架,该文件将被所有其他视图文件扩展。默认情况下,“views”文件夹中的文件将使用这个基本骨架,然后在这个 {{{body}}} 部分中呈现它们的特定内容。这是其他视图将进入并呈现其内容的钩子。

hbs({
defaultLayout: "layout",
extname: ".hbs",
layoutsDir: __dirname + "/views/layouts", 
partialsDir: __dirname + "/views/partials"})

然后在 views 文件夹中创建 layouts 文件夹和 partials 文件夹。在 layouts 目录中创建 layout.hbs。在这个文件中插入一个基本的 html 骨架并在正文中,放置这个

{{{body}}}

【讨论】:

    猜你喜欢
    • 2020-11-17
    • 2013-08-13
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多