Javascript 拆分JSON API';在express app中将对象分成块
我想把API的输出分成不同的页面。我想这样称呼他们: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
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)
});
});