如何使用多个 JSON 对象进行单个 NodeJS/Jade 合并

How to use multiple JSON objects for single NodeJS/Jade Merge

给定以下设置代码(大致符合实际)

default.js(config.js 用于加载基础配置)

{
  "templateData": {
    "corp": {
        "corpName": "Company",
        "DepartmentOne": {
            "name": "DepartmentOne",
            "phone": "1-800-555-555",
            "email": "departmentone@company.com"
        },
        "address": {
            "main": {
                "addressLine1": "Somwhere",
                "city": "SomeTown",
                "stateShort": "SState",
                "stateLong": "SomeState",
                "zipCodeShort": "Zippy"
            }
        },
        "urls": {
            "company": {
                "corporate": {
                    "site": "https://company.com/",
                    "logo": "http://sites.company.com/images/logo.png",
                    "altText" : "Company Corporate Logo"
                },
                "facebook": {
                    "site": "https://www.facebook.com/company",
                    "icon": "http://sites.company.com/images/facebook.png",
                    "altText" : "Company Facebook Page"
                },
                "twitter": {
                    "site": "https://twitter.com/company",
                    "icon": "http://sites.company.com/images/twitter.png",
                    "altText" : "Company Twitter Feed"
                },
                "youtube": {
                    "site": "https://www.youtube.com/company",
                    "icon": "http://sites.company.com/images/youtube.png",
                    "altText" : "Company YouTube Channel"
                }
            }
        },
        "currentYear": "2015",
        "corpWebSiteName": "Company.com"
    }
  }
}

test01.js(主节点代码)

var fs = require('fs');
var bunyan = require('bunyan');
var jade = require('jade');
var config = require('config');
var restify = require('restify');


var log = bunyan.createLogger({src: false, name: "emailTemplateMerger"});

var html = '';

var corpConfig = config.get('templateData');

var emailData = { 'emailAddress' : 'nonya@bidness.com',
              'firstName' : 'nonya',
              'lastName' : 'bidness'
            }

var miscData = { 'billingDate' : '2015-08-01',
             'accountType' : 'new',
             'discountTypes' : {
               'primary' : 'Coupon20',
               'bonus' : 'First30Days',
               'standard' : 'freeShipping'
            }
          }


fs.readFile('./emailTemplates/test01.jade', 'utf-8', function(error, source){
  var template = jade.compile(source);

  html = template(corpConfig)

   console.log(html);
});

翡翠模板:

html
  head
  body
    p.
      Hello #{emailData.firstName},
    p.
     Welcome to #{corp.corpName}'s #{DepartmentOne.name}.
    p. 
      Your next bill will be sent on #{miscData.billingDate} for your #{miscData.accountType}.
    p.
       Thank you

问题:确定将配置数据和 2 个本地数据集(将通过 REST 传入)合并到 Jade 模板中的有效方法。

由于数据有多层嵌套,直接合并可能很复杂并且可能容易出错,具体取决于传入的数据,是否可以通过 Jade 多个单独的数据集并将合并推迟到 Jade 引擎?

我尝试了多次传递,但是 Jade 合并的一次传递从模板中删除了所有标签,因此没有成功。反正我还没想出链接结果。

您可以像这样创建顶级上下文对象:

var context = {
    corp: corpConfig,
    email: emailData,
    misc: miscData
};

....

var html = template(context);

然后将模板引用更改为类似这样的内容

html
  head
  body
    p.
      Hello #{context.email.firstName},
    p.
      Welcome to #{context.corp.corpName}'s #{context.misc.DepartmentOne.name}.