2016-08-11 1 views
2

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' } 
+0

'renderer.render ('Vorlage zu erstellen. html, req.body); 'fehlt ein Apostroph - zu kleine Bearbeitung für mich zu machen. –

+0

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

+0

Ich habe eine einfache Express-App erstellt und habe keine Fehler erhalten. Könnten Sie bitte Ihren Projektcode angeben? –

Antwort

2

Versuchen Änderungscode zu

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 
     ); 
    }); 
} 

zum Kopieren/Mix von Objekten verwenden Object.assign

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

Danke, 'Objekt.assign ({}) 'hat den Trick gemacht. –

Verwandte Themen