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

Why do I need to write JSON.parse(JSON.stringify(data))?

本文关键字:JSON stringify data parse 为什么      更新时间:2023-09-26

我正在写一个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工作之前对表单数据进行字符串化和解析吗?似乎没有任何意义吗?

编辑

为了更好地解释,下面是整个函数:

<<p> 函数/em>
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 });
});

点播。Body又名data

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

创建复制/混合对象使用Object.assign

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