node.js, express: отправлять электронную почту с помощью 'nodemailer' и 'nodemailer-handlebars', давая TypeError [ERR_INVALID_ARG_TYPE]: - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь отправить электронное письмо через шаблон HTML, который находится по тому же пути в папке с именем 'view'.Имя HTML-шаблона - «index.handlebars».Но это дает странную ошибку пути, хотя я думаю, что путь абсолютно правильный.Может кто-нибудь, пожалуйста, помогите мне решить эту проблему.

TypeError [ERR_INVALID_ARG_TYPE]: Аргумент "путь" должен иметь тип string.Полученный тип не определен в 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 ПРИМЕРЫ \ 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 голосов
/ 13 июля 2019

внутри параметров hbs вы не упомянули layoutsDir, который содержит layout.hbs

layout.hbs содержит скелет HTML по умолчанию, и этот файл будет расширен всеми остальными файлами представления.По умолчанию файлы в папке «views» будут использовать этот базовый скелет, а затем отображать свое конкретное содержимое в этой {{{body}}} части.это хук, где другие виды будут входить и отображать их содержимое.

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

затем внутри папки представлений создайте папку раскладок и папку партиалов.создать файл layout.hbs внутри каталога раскладок.внутри этого файла вставьте базовый html-скелет, а внутри тела поместите этот

{{{body}}}
...