Я пытаюсь использовать 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, и какая глупая ошибка новичков я сделал?
Действительно оценивайте свой ответ, но я все еще не совсем там. Я внес поправки в вопрос, чтобы добавить дополнительную информацию и ваши предложения. – Taintedmedialtd
@Taintedmedialtd действительно 'app' действительно существует в точке там, где вы его используете? Если нет, используйте 'res.render()' вместо 'app.render()' (хотя я бы предположил, что приложение потерпело бы крах, потому что вы используете неопределенную переменную, если только в вашем приложении не игнорируются исключения выброшен). – robertklep
было res.render() - ты туз, спасибо. – Taintedmedialtd