Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 拆分JSON API';在express app中将对象分成块_Javascript_Json_Node.js_Api_Express - Fatal编程技术网

Javascript 拆分JSON API';在express app中将对象分成块

Javascript 拆分JSON API';在express app中将对象分成块,javascript,json,node.js,api,express,Javascript,Json,Node.js,Api,Express,我想把API的输出分成不同的页面。我想这样称呼他们:http://127.0.0.1:3000/api/articles/0/ 我有一个伪数据JSON文件: [ { "articles": [ { "id": "0", "url": "audrey-hepburn", "title": "Audrey Hepburn", "body": "Nothing is impossible, the word its

我想把API的输出分成不同的页面。我想这样称呼他们:
http://127.0.0.1:3000/api/articles/0/

我有一个伪数据JSON文件:

[
  {
    "articles": [
      {
        "id": "0",
        "url": "audrey-hepburn",
        "title": "Audrey Hepburn",
        "body": "Nothing is impossible, the word itself says 'I'm possible'!",
        "category": "foo",
        "tags": [ "foo" ]
      },
      {
        "id": "1",
        "url": "walt-disney",
        "title": "Walt Disney",
        "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.",
        "category": "foo",
        "tags": [ "foo", "bar" ]
      },
      {
        "id": "2",
        "url": "unknown",
        "title": "Unknown",
        "body": "Even the greatest was once a beginner. Don't be afraid to take that first step.",
        "category": "bar",
        "tags": [ "foo", "bar", "baz" ]
      },
      {
        "id": "3",
        "url": "neale-donald-walsch",
        "title": "Neale Donald Walsch",
        "body": "You are afraid to die, and you're afraid to live. What a way to exist.",
        "category": "bar",
        "tags": [ "foo", "bar", "baz" ]
      }
    ]
  },
  {
    "users": [
      { "name": "Admin" },
      { "name": "User" }
    ]
  }
]
通过以下方式将其调用到我的API路由器中:

function fsAsync(callback) {
  fs.readFile(__dirname + '/../public/articles/data.json', 'utf8', function(err, data) {
    if (err) {
      return callback(err);
    }
    callback(null, JSON.parse(data));
  });
};
我这样称呼每一篇文章:
http://127.0.0.1:3000/api/articles/

如何实现这一目标

谢谢大家!

更新:

如果我将一个JSON对象拆分成块,有一件事可能会导致问题,那就是它需要首先解析该对象的所有内容,然后决定拆分到哪里?如果用户在567处访问最后一页怎么办?这意味着代码首先必须查询数百万行才能返回想要的页面?如果它是一个数据库,而不是一个包含伪数据的JSON呢?在排序中,从JSON/Mongodb/etc.source返回博客特定页面的最佳实践是什么

更新2:

这将从对象返回前两个项目:

// http://127.0.0.1:3000/api/articles/c/<API-TOKEN>
router.get('/articles/c/:token', function(req, res) {
  fsAsync(function(err, data) {
    if (err) {
      return res.send(err);
    }
    var articles = data[0].articles;

    var count = 0;
    var countMultiply = count * 2;
    var a = countMultiply + 0;
    var b = countMultiply + 2;
    var c = articles.slice(a, b);
    console.log(c);

    var q = c.filter(function (article) {
      // return article.id === req.params.id;
      return article && apiToken === req.params.token;
    });
    res.json(q); // (0*2+0=0, 0*2+2=2), (1*2+0=2, 1*2+2=4), (2*2+0=4, 2*2+2=6), (3*2+0=6, 3*2+2=8)
  });
});
//http://127.0.0.1:3000/api/articles/c/
router.get('/articles/c/:token',函数(req,res){
fsAsync(函数(错误、数据){
如果(错误){
返回res.send(err);
}
var articles=数据[0]。articles;
var计数=0;
var countMultiply=count*2;
var a=countMultiply+0;
var b=countMultiply+2;
var c=物品切片(a,b);
控制台日志(c);
var q=c.filter(函数(文章){
//return article.id==req.params.id;
返回文章&&apiToken===req.params.token;
});
res.json(q);/(0*2+0=0,0*2+2=2),(1*2+0=2,1*2+2=4),(2*2+0=4,2*2+2=6),(3*2+0=6,3*2+2=8)
});
});

我如何能够自动执行此操作,以便能够使用0、1、2、3作为页分隔符?因此,第一页位于
http://127.0.0.1:3000/api/articles/0/
URL返回文章
(0,2)
http://127.0.0.1:3000/api/articles/1/
URL返回文章
(2,4)

更新3:

看起来它在工作:

// http://127.0.0.1:3000/api/articles/page/0/<API-TOKEN>
router.get('/articles/page/:id/:token', function(req, res) {
  fsAsync(function(err, data) {
    if (err) {
      return res.send(err);
    }
    var articles = data[0].articles.reverse();

    var count = req.params.id; // Page number
    var multiplier = 2; // Posts per page

    var countResult = count * multiplier;
    var a = countResult + 0;
    var b = countResult + multiplier;
    var c = articles.slice(a, b);

    var pagesLength = articles.length / multiplier;
    var pagesLengthCeil = Math.ceil(pagesLength); // Sum of all pages

    console.log('pagesLengthCeil: ' + pagesLengthCeil);
    console.log(c);

    var q = c.filter(function (article) {
      // return article.id === req.params.id;
      return article && apiToken === req.params.token;
    });
    res.json(q); // (0*2+0=0, 0*2+2=2), (1*2+0=2, 1*2+2=4), (2*2+0=4, 2*2+2=6), (3*2+0=6, 3*2+2=8)
  });
});
//http://127.0.0.1:3000/api/articles/page/0/
router.get('/articles/page/:id/:token',函数(req,res){
fsAsync(函数(错误、数据){
如果(错误){
返回res.send(err);
}
var articles=data[0]。articles.reverse();
var count=req.params.id;//页码
var乘数=2;//每页的帖子数
var countResult=计数*乘数;
var a=countResult+0;
var b=计数结果+乘数;
var c=物品切片(a,b);
var pagesLength=文章长度/乘数;
var pagesLengthCeil=Math.ceil(pagesLength);//所有页面的总和
log('pagesLengthCeil:'+pagesLengthCeil);
控制台日志(c);
var q=c.filter(函数(文章){
//return article.id==req.params.id;
返回文章&&apiToken===req.params.token;
});
res.json(q);/(0*2+0=0,0*2+2=2),(1*2+0=2,1*2+2=4),(2*2+0=4,2*2+2=6),(3*2+0=6,3*2+2=8)
});
});

但我仍然不知道这是一种使用大型JSON文件还是数据库的有效方法?

如果不遍历所有文章,就无法做到这一点。要查找特定的文章,您必须遍历所有数据。一旦你收集了所有的数据,你就可以决定发送什么了,因为limit和skip会对收集的数据起作用。我明白了。只有JSON数据或数据库也是这样吗?因此,在每次请求时,服务器都必须运行数千行以返回访问者希望看到的特定5或10行?您可以对其进行优化,例如,在遍历和匹配时计算文档。一旦文档大小达到跳过+限制停止。这就是你能做的。
// http://127.0.0.1:3000/api/articles/page/0/<API-TOKEN>
router.get('/articles/page/:id/:token', function(req, res) {
  fsAsync(function(err, data) {
    if (err) {
      return res.send(err);
    }
    var articles = data[0].articles.reverse();

    var count = req.params.id; // Page number
    var multiplier = 2; // Posts per page

    var countResult = count * multiplier;
    var a = countResult + 0;
    var b = countResult + multiplier;
    var c = articles.slice(a, b);

    var pagesLength = articles.length / multiplier;
    var pagesLengthCeil = Math.ceil(pagesLength); // Sum of all pages

    console.log('pagesLengthCeil: ' + pagesLengthCeil);
    console.log(c);

    var q = c.filter(function (article) {
      // return article.id === req.params.id;
      return article && apiToken === req.params.token;
    });
    res.json(q); // (0*2+0=0, 0*2+2=2), (1*2+0=2, 1*2+2=4), (2*2+0=4, 2*2+2=6), (3*2+0=6, 3*2+2=8)
  });
});