JSON:从对象返回整个匹配数组
JSON: return whole matching array from an object
我有一个用于API的JSON文件。这将为我的下一个个人网站提供静态内容:
[
{
"articles": [
{
"_id": "0",
"url": "audrey-hepburn",
"title": "Audrey Hepburn",
"category": "foo",
"body": "Nothing is impossible, the word itself says 'I'm possible'!",
"tags": [ "foo" ]
},
{
"_id": "1",
"url": "walt-disney",
"title": "Walt Disney",
"category": "foo",
"body": "You may not realize it when it happens, but a kick in the teeth may be the best thing in the world for you.",
"tags": [ "foo", "bar" ]
},
{
"_id": "2",
"url": "unknown",
"title": "Unknown",
"category": "bar",
"body": "Even the greatest was once a beginner. Don't be afraid to take that first step.",
"tags": [ "foo", "bar", "baz" ]
},
{
"_id": "3",
"url": "neale-donald-walsch",
"title": "Neale Donald Walsch",
"category": "bar",
"body": "You are afraid to die, and you're afraid to live. What a way to exist.",
"tags": [ "foo", "bar", "baz" ]
},
{
"_id": "4",
"url": "test",
"title": "Test Article",
"category": "bar",
"body": "This is a test article.",
"tags": [ "foo", "bar", "baz", "bam" ]
}
]
},
{
"users": [
{ "name": "Admin" },
{ "name": "User" }
]
}
]
此 JSON 文件由此 API 调用:
/////////////////////////////////////////////////////////////
// GRABS EVERY ARTICLES PER PAGES BY LATEST
// http://127.0.0.1:3000/api/articles/page/0/2/order/adddate/auth/<API-TOKEN>
/////////////////////////////////////////////////////////////
router.get('/articles/page/:start/:end/order/:order/auth/:token', function(req, res) {
fsAsync(function(err, data) {
if (err) {
return res.send(err);
}
if(req.params.order === 'adddate') {
var articles = data[0].articles.reverse();
}
else {
var articles = data[0].articles;
}
var start = req.params.start;
var end = req.params.end;
var slice = articles.slice(start, end);
var q = slice.filter(function (article) {
return article && apiToken === req.params.token;
});
res.json(q);
});
});
/////////////////////////////////////////////////////////////
// GRABS SINGLE ARTICLE BY URL
// http://127.0.0.1:3000/api/articles/url/foo/auth/<API-TOKEN>
// Match any field like "url" and not just the index "id"
/////////////////////////////////////////////////////////////
router.get('/articles/url/:id/auth/:token', function(req, res) {
fsAsync(function(err, data) {
if (err) {
return res.send(err);
}
var articles = data[0].articles;
var q = articles.filter(function (article) {
// return article.id === req.params.id;
return article.url === req.params.id && apiToken === req.params.token;
});
res.json(q[0]);
});
});
单个博客文章的路由器,当我请求具有http://domain.com/journal/audrey-hepburn
URL 的单个博客文章时,它使用 url api:
router.get('/:url', function(req, res, next) {
var URL = req.params.url;
console.log(URL);
var reqURL = req.protocol + '://' + req.hostname + ':' + usedPort + '/api/articles/url/' + URL + '/auth/' + apiToken;
request(reqURL, function (error, response, body) {
console.log(JSON.parse(body));
var articles = JSON.parse(body);
res.render('blog-article', {
layout: 'main',
data: articles
});
})
});
单个博客文章的车把模板:
<article class="id-{{data._id}}">
<h1><a href="/journal/{{data.url}}">{{data.title}}</a></h1>
<div class="category"><a href="/category/{{data.category}}">{{data.category}}</a></div>
<p>{{data.body}}</p>
<div class="tags">
<ul>
{{#each data.tags}}
<li><a href="/tags/{{this}}">{{this}}</a></li>
{{/each}}
</ul>
</div>
</article>
例如,如果我想在我想查看Audrey Hepburn
时访问我的http://domain.com/journal/audrey-hepburn
URL?我使用这个解决方案。
我的问题是,如果没有任何 URL 路由器解决方案,只有第一个将每个文章数组抓取到 JSON 文件中的单个对象中的解决方案,我如何修改路由器?
当然,最简单的方法是,如果我为每个文章数组创建一个对象,其名称为 _id
或 url
,但不幸的是,我想将此模板用于将来使用外部 api 的网站,而不是每个 api 都用唯一标识符分隔他们的帖子内容,而是遵循相同的路线,将请求与其他数组放在同一个对象中。
谢谢你的帮助!
解决方案(谢谢珊珊(:
var db = '/../public/articles/data.json';
var data = require(__dirname + db);
router.get('/:url', function (req, res, next) {
var articles = data[0].articles;
var url = req.params.url;
var selectedArticle = articles.find(function(article) {
return article.url === url;
});
console.log(selectedArticle);
res.render('blog-article', {
layout: 'main',
data: selectedArticle
});
});
您已经知道如何创建路由,只需要过滤文章:
router.get('/journal/:url', function (req, res, next) {
fsAsync(function (err, data) {
var articles = data[0].articles;
var url = req.params.url;
// this will get you the first article matching the url
var selectedArticle = articles.find(function(article) {
return article.url == url;
});
// render your page with selectedArticle
});
});
附带说明一下,如果您的 JSON 文件未被您的应用更改或不经常更改,则可以使用 require 一劳永逸地加载它,而不是一次又一次地读取文件:
// data is an object
var data = require(__dirname + db);
router.get('', function (req, res, next) {
var articles = data[0].articles;
// ...
});
相关文章:
- 对象数组返回自最近日期以来的最高总体值
- 从多维数组返回嵌套数组
- 为什么当我点击<a>使用纯javascript;这个“;返回url,数组返回“url”;未定义”;
- 带多维数组返回字符串的json_encode;阵列”;而不是数据
- 如何将 AJAX 响应作为 JavaScript 数组返回
- 我正在尝试在 JS 中制作这个随机名称生成器.数组返回未定义
- .push() 多个对象进入 JavaScript 数组返回 'undefined'
- 如何按属性从可观察数组返回项
- 通过jquery发送的关联php数组返回[对象对象]
- 从 Javascript 中的对象数组返回单个属性的数组
- 循环遍历对象数组返回“未定义”
- 拼接数组返回空的序列
- Javascript 多维数组返回第一个值,然后失败
- Json 数组返回空值
- 从下划线.js中的数组返回一系列值
- for 语句不从数组返回值
- MongoDB从数组返回特定字段
- 试图将数组返回到表中的列表中
- Javascript中的二维数组返回未定义的数组
- 将函数数组作为布尔值数组返回