Я пишу веб-приложение 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' }
'renderer.render ('шаблон. html, req.body); 'отсутствует апостроф - слишком маленькое редактирование для меня. –
Кроме комментария @DanielShillcock (большой улов), вы используете 'JSON.parse (JSON.strigify (...))' для передачи COPY объекта, а не самого объекта. Представьте, что вы передаете это как параметр процедуры и по какой-либо причине хотите внести локальное изменение в содержимое JSON. Без 'parse ... stringify ... 'изменение внутри процедуры также повлияет на исходный (исходный) объект. – FDavidov
Я создал базовое экспресс-приложение, и я не получил никаких ошибок. Не могли бы вы предоставить код проекта? –