2016-08-11 4 views
2

Я пишу веб-приложение Node.js, которое использует Express как фреймворк и Nunjucks в качестве механизма шаблонов.Зачем мне писать JSON.parse (JSON.stringify (data))?

Одна часть приложения предназначена для отправки данных формы в виде электронной почты. Шаблон Nunjucks с данными формы внутри компилируется во время процесса, который затем отправляется на сервер электронной почты.

Данные формы является JSON объект (req.body), но по какой-то странной причине, мне нужно отправить данные формы, как это:

const renderer = nunjucks.configure('/path/to/template'); 

renderer.render('template.html', JSON.parse(JSON.stringify(req.body))); 

Просто писать renderer.render('template.html', req.body); не работает, он выдает сообщение об ошибке :

TypeError: ctx.hasOwnProperty is not a function 
    at Obj.extend.init (D:\Projects\vcs.vitra.com\node_modules\nunjucks\src\environment.js:338:20) 
    at new new_cls (D:\Projects\vcs.vitra.com\node_modules\nunjucks\src\object.js:46:28) 
    at Obj.extend.render (D:\Projects\vcs.vitra.com\node_modules\nunjucks\src\environment.js:473:23) 
    at D:\Projects\vcs.vitra.com\node_modules\nunjucks\src\environment.js:311:35 
    at createTemplate (D:\Projects\vcs.vitra.com\node_modules\nunjucks\src\environment.js:234:25) 
    at handle (D:\Projects\vcs.vitra.com\node_modules\nunjucks\src\environment.js:249:25) 
    at D:\Projects\vcs.vitra.com\node_modules\nunjucks\src\environment.js:263:21 
    at next (D:\Projects\vcs.vitra.com\node_modules\nunjucks\src\lib.js:207:13) 
    at Object.exports.asyncIter (D:\Projects\vcs.vitra.com\node_modules\nunjucks\src\lib.js:214:5) 
    at Obj.extend.getTemplate (D:\Projects\vcs.vitra.com\node_modules\nunjucks\src\environment.js:242:17) 

ли кто-то имеет представление о том, почему мне нужно stringify и анализировать данные формы, прежде чем он работает в Nunjucks? Кажется, не имеет никакого смысла?

Редактировать

Вот целая функция для лучшего объяснения:

Функция

function sender(data, callback) { 
    const config = require('./config'), 
     renderer = nunjucks.configure(path.join(__dirname, 'views', 'mail-templates')), 
     transporter = nodemailer.createTransport((smtpTransport(config.smtp))); 

    transporter.sendMail({ 
    from: `${data.name} <${data.email}>`, 
    replyTo: data.email, 
    to: config.email.receiver, 
    subject: config.email.subject, 
    html: renderer.render(`${data.origin}.html`, JSON.parse(JSON.stringify(data))), 
    }, callback); 
} 

Вызов функции

sender(req.body, (message, err) => { 
    res.json({ message: message, errors: err }); 
}); 

req.body ака данных

{ contacttype: 'E-Mail', 
    software: '', 
    text: 'Test', 
    email: '', 
    name: '', 
    origin: 'contact' } 
+0

'renderer.render ('шаблон. html, req.body); 'отсутствует апостроф - слишком маленькое редактирование для меня. –

+0

Кроме комментария @DanielShillcock (большой улов), вы используете 'JSON.parse (JSON.strigify (...))' для передачи COPY объекта, а не самого объекта. Представьте, что вы передаете это как параметр процедуры и по какой-либо причине хотите внести локальное изменение в содержимое JSON. Без 'parse ... stringify ... 'изменение внутри процедуры также повлияет на исходный (исходный) объект. – FDavidov

+0

Я создал базовое экспресс-приложение, и я не получил никаких ошибок. Не могли бы вы предоставить код проекта? –

ответ

2

изменение Try кода в

function sender(data, callback) { 
    const config = require('./config'), 
     renderer = nunjucks.configure(path.join(__dirname, 'views', 'mail-templates')), 
     transporter = nodemailer.createTransport((smtpTransport(config.smtp))); 

    renderer.render(`${data.origin}.html`, data, function(err, html){ 
     if (err) 
      return callback(err); 

     transporter.sendMail({ 
      from: `${data.name} <${data.email}>`, 
      replyTo: data.email, 
      to: config.email.receiver, 
      subject: config.email.subject, 
      html: html 
      }, callback 
     ); 
    }); 
} 

Для создания копий/микс из объектов использовать Object.assign

let copy = Object.assign({}, src1, src2); 
+0

Спасибо, 'Объект.присваивать ({}) 'трюк. –

Смежные вопросы