在使用express传递查看之前操作terminaljson数据

我目前正在从一个快速网站上抓取来自各种web服务调用的内容和数据。 用于呈现网站超级菜单的网站导航数据来自发送嵌套json结果集的端点,该结果集包含导航部分用于呈现视图的结构hrefs,titles。

这是一个简短的例子:

{ "results": [ { "title": "My Cool Site", "contents": [ { "title": "Fruits", "contents": [ { "title": "index", "path": "/my-cool-site/fruits", "inode": "fc5dba53-b925-4933-869b-e8c68c89e8ab", "href": "/my-cool-site/fruits/index.html" }, { "title": "Apples", "path": "/my-cool-site/fruits/apples", "inode": "e67c34bb-9b1a-4c1b-8beb-df986827be27", "href": "/my-cool-site/fruits/apples.html" }, { "title": "Bananas", "path": "/my-cool-site/fruits/bananas", "inode": "e67c34bb-9b1a-4c1b-8beb-df986827be27", "href": "/my-cool-site/fruits/bananas.html" } ], "path": "/my-cool-site/fruits", "inode": "89d90234-f955-4726-9116-a599b8c92138", "href": "/my-cool-site/fruits" }, { "title": "Vegetables", "contents": [ { "title": "index", "path": "/my-cool-site/vegetables", "inode": "57d1af70-a674-4ec3-965a-7eb0e0da3c75", "href": "/my-cool-site/vegetables/index.html" }, { "title": "Broccoli", "path": "/my-cool-site/vegetables/broccoli", "inode": "57d1af70-a674-4ec3-965a-7eb0e0da3c75", "href": "/my-cool-site/vegetables/broccoli.html" }, { "title": "Brussel Sprouts", "path": "/my-cool-site/vegetables/brussel-sprouts", "inode": "57d1af70-a674-4ec3-965a-7eb0e0da3c75", "href": "/my-cool-site/vegetables/brussel-sprouts.html" }, ], "path": "/my-cool-site/vegetables", "inode": "89d90234-f955-4726-9116-a599b8c92138", "href": "/my-cool-site/vegetables" } ] } ] } 

生成导航树的服务用于多个站点,因此您可以看到对于某些数据(如“href”):这些值包含我想要从导航中删除的“/ my-cool-site”的上下文path。 例如,当我呈现的导航链接,苹果的节点应该有一个href ='/ fruits / apples.html''/my-cool-site/fruits/apples.html'所以,我将如何做replacehref值在哪里出现?

如何才能完成这个最好的方法? 在我的控制器/路由中,我正在调用获取数据,然后将nav对象传递给我的视图。

  client.get(navEndPointUrl, function(nav, response) { res.render('templateName', { nav: nav }); }); 

我是新来的节点/快递,所以我正在寻找最好的方式来处理这个例子。 把它在视图中? 将nav对象传递给lodash / underscore函数? 对于后者,当我们在大海捞针中可能出现许多不同的嵌套位置(例如,这些链接中的一些可能在json中的4-5个嵌套节点下)时,我遇到了麻烦,并且还需要返回整个JSON对象,不只是件它。 使用某种正则expression式的JSON.parse会更好吗? 我不知道,我对这个有点头痛。

为了logging,我预计这个项目将会有各种各样的项目,所以任何关于使这个更全面的解决scheme的指导将非常感激。

pathhref对象值中删除/my-cool-site发生。

 function formatResults(data, path, keys) { function format(data) { var result = {} if (_.isObject(data)) { _.forOwn(data, function (value, key) { if (_.contains(keys, key)) { value = value.replace(path, ''); } result[key] = format(value); }); } else if (_.isArray(data)) { result = _.map(array, format); } else { result = data; } return result; } return format(data); } var formattedResults = formatResults(json, '/my-cool-site', ['path', 'href']); console.log(formattedResults); 

http://jsfiddle.net/moogs/sq1qeojp/1/

像平常一样在模板中迭代结果对象。

把手:

把手可能是一个很好的select,利用助手和/或部分function来处理您的href属性。 你的代码可能看起来像这样:

 var Handlebars = require('handlebars'); Handlebars.registerHelper('relative_to', function(rootPath) { var relativePath = this.href; if (relativePath.indexOf(rootPath) === 0) { relativePath = relativePath.substr(rootPath.length); } return new Handlebars.SafeString(relativePath); }); var context = { contents: [{ "title": "index", "path": "/my-cool-site/fruits", "inode": "fc5dba53-b925-4933-869b-e8c68c89e8ab", "href": "/my-cool-site/fruits/index.html" }] }; var source = "{{#contents}}<a href={{relative_to '/my-cool-site'}}>{{title}}</a>{{/contents}}"; var template = Handlebars.compile(source); console.log(template(context)); 

哪些产出:

 <a href=/fruits/index.html>index</a> 

Dust.js:

它看起来像Dust.js具有类似的filterforms的function: http ://www.dustjs.com/docs/filter-api/和助手: http ://www.dustjs.com/guides/dust-helpers/如果你想指定参数。

Dust.js真的很不错:

 function relativeTo(chunk, context, bodies, params) { return chunk.tap(function(data) { var relativePath = data; if (relativePath.indexOf(params.path) === 0) { relativePath = relativePath.substr(params.path.length); } return relativePath; }).render(bodies.block, context).untap(); } dust.helpers.relativeTo = relativeTo; var data = { "contents": [{ "title": "index", "href": "/my-cool-site/fruits/index.html" }] }; var source = '{#contents}<a href="{@relativeTo path="/my-cool-site"}{href}{/relativeTo}">{title}</a>{/contents}'; var compiled = dust.compile(source, "intro"); dust.loadSource(compiled); dust.render("intro", data, function(err, out) { if (err) throw err; console.log(out); }); 

更新:它看起来像Dust.js甚至可以从数据上下文内插你的帮助参数。 所以build立在上面的代码可以做这样的事情:

 data.relativePath = "/my-cool-site"; var source = '{#contents}<a href="{@relativeTo path=relativePath}{href}{/relativeTo}">{title}</a>{/contents}'; 

这真的很棒:)