web-dev-qa-db-ja.com

エラー:パーシャルディレクトリは、ハンドルバーの文字列または構成オブジェクトである必要があります

nodemailernodemailer-express-handlebarsを使用してテンプレート化されたメールを送信していますが、メールを送信しようとすると、

Error: A partials dir must be a string or config object.

何が問題なのかわかりません。

const express = require('express');
const hbs = require('nodemailer-express-handlebars');
const nodemailer = require('nodemailer');
const app = express();

const user_name     = '[email protected]';
const refresh_token = 'xxxxxxxxxxxxxxxxxxxxxxxx';
const client_id     = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
const client_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
const email_to = '[email protected]';

let transporter = nodemailer
    .createTransport({
        service: 'Gmail',
        auth: {
            type: 'OAuth2',
            clientId: client_id,
            clientSecret: client_secret
        },
        tls:{
            rejectUnauthorized: false
        }
    });
transporter.use('compile', hbs({
    viewPath: 'views/email',
    extName: '.hbs'
}));
transporter.on('token', token => {
    console.log('A new access token was generated');
    console.log('User: %s', token.user);
    console.log('Access Token: %s', token.accessToken);
    console.log('Expires: %s', new Date(token.expires));
});
let mailOptions = {
    from    : user_name,
    to      : email_to,
    subject : 'Hello ✔',
    text    : 'Hello world ?',
    template: 'emailt',
    context: {},
    auth : {
        user         : user_name,
        refreshToken : refresh_token,
        expires      : 1494388182480
    }
};

// send mail with defined transport object


app.get('/', (req,res) => {
    transporter.sendMail(mailOptions).then( r => {
        res.send(r);
    }).catch(e =>{
        res.send(e);
    });
});
app.listen(3000 ,()=>{
    console.log('port: 3000');
});

私のディレクトリは次のようになりますviews>email>emailt.hbs

2
Rahul

エクスプレスハンドルバーへの最近の変更がこの問題を引き起こしたようです、誰かがここに修正を投稿しました https://github.com/yads/nodemailer-express-handlebars/issues/22

または

少なくとも修正されるまでは、この問題が発生していないバージョンに戻ることができると思います。

7
MAhsan

コードが機能するようになり、問題が解決した場合に備えて投稿しました。以前はフィールドがなかったpartialsDirhandlebarOptionsを追加する必要がありました。

const handlebarOptions = {
  viewEngine: {
    extName: '.hbs',
    partialsDir: 'src/path',
    layoutsDir: 'src/path',
    defaultLayout: 'email.hbs',
  },
  viewPath: 'src/path',
  extName: '.hbs',
};

transporter.use('compile', hbs(handlebarOptions));

お役に立てれば。

3