2016-02-15 4 views
-1

У меня есть файл 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 
    }); 
}); 
+0

Я думаю, вам нужен jsonpath: https://github.com/s3u/JSONPath –

+1

Пожалуйста, сваривайте свою проблему до нескольких десятков строк кода. –

ответ

2

Вы уже знаете, как создать маршрут, вам нужно только отфильтровать статьи:

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-файл не изменяется вашим приложением или не изменяется часто, вы можете загрузить его раз и навсегда с требованием, а не читать файл снова и снова:

// data is an object 
var data = require(__dirname + db); 

router.get('', function (req, res, next) { 
    var articles = data[0].articles; 
    // ... 
}); 
+0

Я изменил ваш ответ на мой код, спасибо! – Lanti

Смежные вопросы