3

Express をフレームワークとして使用し、Nunjucks をテンプレート エンジンとして使用する Node.js Web アプリケーションを作成しています。

アプリケーションの一部は、フォーム データを電子メールとして送信することです。プロセス中にフォーム データを含む 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 で機能する前に、フォーム データを文字列化して解析する必要がある理由を誰かが知っていますか? 意味がないように見えますか?

編集

より良い説明のために、関数全体を次に示します。

関数

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

1 に答える 1

2

コードを次のように変更してみてください

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);
于 2016-08-11T20:21:33.920 に答える