JSON:从对象返回整个匹配数组

JSON: return whole matching array from an object

本文关键字:数组 返回 对象 JSON      更新时间:2023-09-26

我有一个用于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 文件中的单个对象中的解决方案,我如何修改路由器?

当然,最简单的方法是,如果我为每个文章数组创建一个对象,其名称为 _idurl ,但不幸的是,我想将此模板用于将来使用外部 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;
    // ...
});