Javascript:具有多个查询参数的嵌套JSON api请求

Javascript:具有多个查询参数的嵌套JSON api请求,javascript,json,node.js,api,express,Javascript,Json,Node.js,Api,Express,我试图为我的下一个网站制作一个API,但在一个express应用程序中很难获得相同url的多个查询结果 虚拟数据: var data = [{ articles : [{ id : '0', url : 'foo', title : 'Foo', body : 'some foo bar', category : 'foo', tags : [ 'foo'

我试图为我的下一个网站制作一个API,但在一个express应用程序中很难获得相同url的多个查询结果

虚拟数据:

var data = [{
    articles : [{
        id : '0',
        url : 'foo',
        title : 'Foo',
        body : 'some foo bar',
        category : 'foo',
        tags : [
            'foo'
        ]
    }, {
        id : '1',
        url : 'foo-bar',
        title : 'Foo bar',
        body : 'more foo bar',
        category : 'foo',
        tags : [
            'foo', 'bar'
        ]
    }, {
        id : '2',
        url : 'foo-bar-baz',
        title : 'Foo bar baz',
        body : 'more foo bar baz',
        category : 'foo',
        tags : [
            'foo',
            'bar',
            'baz'
        ]
    }]
}, {
    users : [{
        name: 'Admin'
    }, {
        name: 'User'
    }]
}];
路由器:

// Grabs articles by categories and tags
// http://127.0.0.1:3000/api/articles/category/foo/tag/bar
router.get('/articles/category/:cat/tag/:tag', function(req, res) {
  var articles = data[0].articles;
  var q = articles.filter(function (article) {
    return article.category === req.params.cat;
    return article.tags.some(function(tagId) { return tagId === req.params.tag;});
  });
  res.json(q);
});
如果我请求
http://127.0.0.1:3000/api/articles/category/foo/tag/bar
url?现在,如果我这样做,
tag
url将被忽略,只有
category
请求才有效

谢谢你的帮助

问题就在这里>>

return article.category === req.params.cat;
return article.tags.some(function(tagId) { return tagId === req.params.tag;});
第一个
return
语句将停止函数中的进一步操作 所以你需要
如果。。。else
案例
或此处的帮助函数

问题在此处>>

return article.category === req.params.cat;
return article.tags.some(function(tagId) { return tagId === req.params.tag;});
第一个
return
语句将停止函数中的进一步操作
所以你需要
如果。。。否则
案例
或此处的帮助函数

您需要重写
返回
语句,如下所示:

return article.category === req.params.cat &&
       article.tags.some(function(tagId) {
           return tagId === req.params.tag;
       });
。。。使用,否则您将只在第一个条件下进行测试,而不会到达另一个语句

以下是当请求位于类别“foo”和标记“bar”上时的测试:

var数据=
[
{条款:
[
{id:'0',url:'audrey hepburn',title:'audrey hepburn',body:'没有什么是不可能的,单词本身说'我是可能的'!',类别:'foo',标签:['foo']},
{id:'1',url:'walt disney',title:'walt disney',body:'当事情发生时,你可能没有意识到,但对你来说,牙齿上的一脚可能是世界上最好的事情。',
{id:'2',url:'unknown',title:'unknown',body:'即使是最伟大的人也曾经是初学者。不要害怕迈出第一步。'category:'bar',tags:['foo','bar','baz']},
{id:'3',url:'neale donald walsch',标题:'neale donald walsch',正文:'你害怕死,你害怕活。这是一种多么好的生存方式',类别:'bar',标签:['foo','bar','baz']}
]
},
{用户:
[
{name:'Admin'},
{name:'用户'}
]
}
];
req={params:{cat:'foo',tag:'bar'};
var articles=数据[0]。articles;
var q=articles.filter(函数(article){
return article.category==req.params.cat&&
article.tags.some(函数(tagId){
return tagId==req.params.tag;
});
});

write(“”,JSON.stringify(q,null,4),“”)
您需要将
return
语句重写如下:

return article.category === req.params.cat &&
       article.tags.some(function(tagId) {
           return tagId === req.params.tag;
       });
。。。使用,否则您将只在第一个条件下进行测试,而不会到达另一个语句

以下是当请求位于类别“foo”和标记“bar”上时的测试:

var数据=
[
{条款:
[
{id:'0',url:'audrey hepburn',title:'audrey hepburn',body:'没有什么是不可能的,单词本身说'我是可能的'!',类别:'foo',标签:['foo']},
{id:'1',url:'walt disney',title:'walt disney',body:'当事情发生时,你可能没有意识到,但对你来说,牙齿上的一脚可能是世界上最好的事情。',
{id:'2',url:'unknown',title:'unknown',body:'即使是最伟大的人也曾经是初学者。不要害怕迈出第一步。'category:'bar',tags:['foo','bar','baz']},
{id:'3',url:'neale donald walsch',标题:'neale donald walsch',正文:'你害怕死,你害怕活。这是一种多么好的生存方式',类别:'bar',标签:['foo','bar','baz']}
]
},
{用户:
[
{name:'Admin'},
{name:'用户'}
]
}
];
req={params:{cat:'foo',tag:'bar'};
var articles=数据[0]。articles;
var q=articles.filter(函数(article){
return article.category==req.params.cat&&
article.tags.some(函数(tagId){
return tagId==req.params.tag;
});
});

write(“”,JSON.stringify(q,null,4),“”)
返回article.category==req.params.cat,article.tags.some(函数(tagId){return tagId==req.params.tag;})看起来像是工作。这是一个好的解决方案吗?编辑:没有。返回每个类别。标记将起作用。不,
return
在这种情况下将执行除返回最后一个语句以外的所有语句。您可以尝试
[articles].indexOf(el)
[Tags].indexOf(el)
如果两者都是数组。
return article.category==req.params.cat,article.Tags.some(函数(tagId){return tagId==req.params.tag;})看起来像是工作。这是一个好的解决方案吗?编辑:没有。返回每个类别。标签起作用。不,
return
在这种情况下将执行除返回最后一个语句以外的所有语句。您可以尝试
[articles]。indexOf(el)
[Tags]。如果两者都是数组,则indexOf(el)
。我想我可能误解了。您希望执行如下请求:
/articles/category/foo/tag/bar
。是这样吗?你能不能把原来的
router.get(/articles/category/:cat/tag/:tag'),…
URL模式放回去,在函数中只输出
res.json(req.params)
。我想确保您在该
参数中看到bot类别和标记。好的,这意味着URL模式工作正常。忘记我写的所有内容,我将我的答案恢复到以前的状态。现在让我检查一下还有什么可能出错……我使用您在github上的数据更新了我的答案,并替换了它带有
&&
|
操作符要求同时满足cat和tag条件。我稍微美化了一下api路由器。再次感谢您的帮助!:)不,我的意思是,当您将
article.category==req.params.cat
移到
some
回调函数中时,实际上,您将该测试的执行倍增,这将始终是相同的。但实际上,这不会对性能产生太大影响。没关系,我想我可能误解了。您希望执行如下请求:
/articles/category/foo/tag/bar
。是这样吗?库尔