2015-08-17 22 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是一個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()爲好)

這是假設你實際上使用快遞。如果沒有,只需使用hogan.js作爲使用hogan-express在這種情況下沒有多大意義。

+0

真的很感謝你的回答,但我還是不太瞭解。我已經修改了這個問題以包含更多信息和建議。 – Taintedmedialtd

+0

@Taintedmedialtd確實存在你使用它的地方嗎?如果沒有,請使用'res.render()'而不是'app.render()'(儘管我會假設應用程序會因爲使用未定義的變量而崩潰,除非應用程序中的某些內容忽略了異常拋出)。 – robertklep

+0

它是res.render() - 你是王牌,謝謝。 – Taintedmedialtd

相關問題