Ich schreibe eine Node.js Web-Anwendung, die Express als Framework und Nunjucks als Vorlage-Engine verwendet.Warum muss ich JSON.parse (JSON.stringify (data)) schreiben?
Ein Teil der Anwendung ist das Senden von Formulardaten als E-Mail. Während des Prozesses wird eine Nunjucks-Vorlage mit den Formulardaten kompiliert, die dann an den E-Mail-Server gesendet wird.
Die Formulardaten ist ein JSON-Objekt (req.body
), aber aus irgendeinem seltsamen Grund, ich brauche die Formulardaten wie folgt einreichen:
const renderer = nunjucks.configure('/path/to/template');
renderer.render('template.html', JSON.parse(JSON.stringify(req.body)));
einfach schreiben renderer.render('template.html', req.body);
nicht funktioniert, es einen Fehler wirft :
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)
hat jemand eine Idee hat, warum ich brauche die Formulardaten an stringify und zu analysieren, bevor es in Nunjucks funktioniert? Scheint keinen Sinn zu machen?
bearbeiten
Hier ist die gesamte Funktion für eine bessere Erklärung:
Funktion
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);
}
Funktionsaufruf
sender(req.body, (message, err) => {
res.json({ message: message, errors: err });
});
req.body aka Daten
{ contacttype: 'E-Mail',
software: '',
text: 'Test',
email: '',
name: '',
origin: 'contact' }
'renderer.render ('Vorlage zu erstellen. html, req.body); 'fehlt ein Apostroph - zu kleine Bearbeitung für mich zu machen. –
Neben dem Kommentar @DanielShillcock (great catch) verwenden Sie 'JSON.parse (JSON.strigify (...))' ', um eine COPY des Objekts und nicht das Objekt selbst zu übergeben. Stellen Sie sich vor, dass Sie dies als Parameter an eine Prozedur übergeben und aus welchem Grund auch immer Sie den Inhalt von JSON lokal ändern möchten. Ohne das 'parse ... stringify ...' beeinflusst die Änderung innerhalb der Prozedur auch das Quellobjekt (Originalobjekt). – FDavidov
Ich habe eine einfache Express-App erstellt und habe keine Fehler erhalten. Könnten Sie bitte Ihren Projektcode angeben? –