为什么我需要编写JSON.parse(JSON.stringify(data))?

我正在写一个Node.js的Web应用程序,它使用Express作为框架和Nunjucks作为模板引擎。

应用程序的一部分是发送表单数据作为电子邮件。 一个带有表格数据的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) 

有人有一个想法,为什么我需要在Nunjucks工作之前对表单数据进行串联和parsing? 似乎没有任何意义?

编辑

下面是整个function的更好的解释:

function

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

尝试更改代码

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

要创build对象的复制/混合,请使用Object.assign

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