【问题标题】:How do I use Hogan-Express to compile an email template in an Express application?如何使用 Hogan-Express 在 Express 应用程序中编译电子邮件模板?
【发布时间】:2015-08-17 10:39:00
【问题描述】:

我正在尝试使用 hogan-express 编译一个 html 电子邮件模板以在我的节点应用程序中发送。基本示例是一封欢迎电子邮件,它向新用户发送他们的登录凭据。 html 模板非常简单,只在正确的点输出数据,例如:{{username}}。我遇到的问题是我似乎无法将编译后的模板作为 html 获取以传递给 nodemailer。

根据 robertlkep 的非常有用的帖子,我已经修改了我的代码,但仍然无法使事情正常工作。我可以确认 app.js 文件中有以下内容:

app.set('views', path.join(__dirname, 'views'));
app.engine('html', require('hogan-express'));
app.set('view engine', 'html');
app.set('layout', 'layouts/default');

因此,该应用程序使用该引擎处理所有视图,并且运行得非常好(根本不喜欢 Jade)。违规路线已更改为以下内容:

var express = require('express');
var router = express.Router();
var User = require('../models/user');
var Report = require('../models/report');
var passport = require("passport");
var localStrategy = require("passport-local").Strategy;
var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');

router.post('/register', function(req, res, next) {

    // Registration logic etc

    var password = req.body.password;
    var email = req.body.email;
    var company = req.body.company;
    var name = req.body.name;
    var role = req.body.role;

    req.checkBody('email','Email field is required').notEmpty();
    req.checkBody('email','Email not valid').isEmail();
    req.checkBody('company','Company field is required').notEmpty();
    req.checkBody('name','Name field is required').notEmpty();

    var errors = req.validationErrors();
    if (errors) {
        res.render('register',{
           errors: errors,
           email: email,
           company: company,
           name: name,
           role: role 
        });
    } else {
        var newUser = new User({
           email: email,
           company: company,
           name: name,
           password: password,
           role: role
        });
        // Create User
        User.createUser(newUser, function(err,user){
            if (err) throw err;

            var textContent = 'You can log in at with your email address and this password: ' + password;

            app.render('emails/welcome', {
                layout:"layouts/email", 
                title: "Email Title",
                message:"Main Message",
                username: email, 
                password:password
            }, function(err,html) {

                if (err) throw err;

                console.log(html);

                var mailOptions = {
                    from:   'Test Email <test@test.co.uk>',
                    to:     email,
                    subject:'Subject',
                    text:   textContent,
                    html:   html
                };

                var transporter = nodemailer.createTransport(smtpTransport({
                    host: 'smtp.host.co.uk',
                    port: 465,
                    secure:true,
                    auth: {
                        user: 'test@test.co.uk',
                        pass: process.env.EMAIL_PASSWORD
                    }
                })); 

                transporter.sendMail(mailOptions, function(error,info) {
                    if (error) {
                        console.log(error);
                        req.flash('error', "Emailed failed");

                        res.location('/users');
                        res.redirect('/users');
                    } else {
                        console.log('Message sent: ' + info.response);
                        // Send flash message
                        req.flash('success', "New user created");

                        res.location('/users');
                        res.redirect('/users');
                    };
                });

            });                          
        });
    };
});

我已经从中删除了任何太具体的内容,我并没有真正从 test@test.com 发送电子邮件。无论如何,使用此代码创建了用户,但 html 不会登录到控制台,并且应用程序只是挂起。我对 Node 还是很陌生,所以我犯了什么愚蠢的新手错误?

【问题讨论】:

    标签: node.js email hogan.js


    【解决方案1】:

    hogan-express 是一个 Express 模板引擎。如果你想使用它,你必须先正确设置它:

    // assuming that `app` is your Express app instance
    app.set('views', './views');
    app.set('view engine', 'html');
    app.engine('html', require('hogan-express'));
    

    如果要渲染模板并捕获生成的 HTML,则可以使用app.render()

    app.render('emails/welcome', { ... }, function(err, html) {
      ...
    });
    

    (或者,如果app 不在范围内,您也可以使用res.render()

    这假设您实际上是在使用 Express。如果没有,请使用hogan.js,因为在这种情况下使用hogan-express 没有多大意义。

    【讨论】:

    • 非常感谢您的回答,但我仍然不完全在那里。我已修改问题以包含更多信息和您的建议。
    • @Taintedmedialtd app 确实存在于您使用它的那一点吗?如果不是,请使用res.render() 而不是app.render()(尽管我会假设应用程序会因为您使用未定义的变量而崩溃,除非您的应用程序中的某些内容忽略了抛出的异常)。
    猜你喜欢
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多