2015-08-17 2 views
0

Я пытаюсь использовать hogan-express для компиляции html-шаблона электронной почты для отправки в моем приложении-узле. Основным примером является приветственное письмо, которое отправляет новому пользователю свои учетные данные. Шаблон html действительно прост и просто выводит данные, например: {{username}} в правильных точках. Проблема, с которой я сталкиваюсь, - я не могу получить скомпилированный шаблон как html для перехода к nodemailer.Как использовать Hogan-Express для компиляции шаблона электронной почты в приложении Express?

Основываясь на действительно полезном сообщении 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'); 

Так что приложение использует этот двигатель для всех представлений, и это работает очень хорошо (не нравится Джейд вообще). Маршрут обижая был изменен на следующее содержание:

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 <[email protected]>', 
        to:  email, 
        subject:'Subject', 
        text: textContent, 
        html: html 
       }; 

       var transporter = nodemailer.createTransport(smtpTransport({ 
        host: 'smtp.host.co.uk', 
        port: 465, 
        secure:true, 
        auth: { 
         user: '[email protected]', 
         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'); 
        }; 
       }); 

      });       
     }); 
    }; 
}); 

Я раздел ничего слишком специфического от него, я не отправлять сообщения электронной почты из [email protected] В любом случае, используя этот код, пользователь создается, но html не входит в консоль и приложение просто зависает. Я до сих пор довольно новичок в Node, и какая глупая ошибка новичков я сделал?

ответ

2

hogan-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 не имеет большого смысла в этой ситуации.

+0

Действительно оценивайте свой ответ, но я все еще не совсем там. Я внес поправки в вопрос, чтобы добавить дополнительную информацию и ваши предложения. – Taintedmedialtd

+0

@Taintedmedialtd действительно 'app' действительно существует в точке там, где вы его используете? Если нет, используйте 'res.render()' вместо 'app.render()' (хотя я бы предположил, что приложение потерпело бы крах, потому что вы используете неопределенную переменную, если только в вашем приложении не игнорируются исключения выброшен). – robertklep

+0

было res.render() - ты туз, спасибо. – Taintedmedialtd