У меня есть файл JSON для 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]);
});
});
маршрутизатор для одного сообщения в блоге, который использует URL-адрес апи, когда я сделать запрос на одном блоге с http://domain.com/journal/audrey-hepburn
URL:
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>
Например, если я хочу посетить свой URL-адрес http://domain.com/journal/audrey-hepburn
, когда я хочу увидеть Audrey Hepburn
? Я использую это решение.
Вопрос в том, как я модифицирую маршрутизатор, если нет никакого маршрутизатора URL-адресов, а только первое решение, которое захватывает каждый массив статей в один объект в файле JSON?
Конечно, проще всего было бы, если бы я создания объекта для каждого массива статьи с именем его _id
или url
, но, к сожалению, я хочу использовать этот шаблон для будущих сайтов с внешними APIs и не каждый апи отделяя свой пост содержимое с уникальными идентификаторами, вместо того, чтобы следовать одному и тому же маршруту, имея запрос в том же объекте с другими массивами.
Благодарим за помощь!
РАСТВОРА (Спасибо за Сяньшань):
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
});
});
Я думаю, вам нужен jsonpath: https://github.com/s3u/JSONPath –
Пожалуйста, сваривайте свою проблему до нескольких десятков строк кода. –