我正在尝试写一个简单的API来从数据库中获取产品。我想通过给定的特定参数来过滤此数据,这些参数是可选的:
router.get('/articles/:type?/:year?/:model?', api_controller.articles);我的控制器看起来像这样:
exports.articles = async (req, res, next) => {
const articles = await Article.find({
'models': {
$elemMatch: {
'year': req.params.year,
'category': req.params.type,
'name': req.params.model,
}
}
});
res.send(articles);}
但是,这只适用于具有3个参数的URL。如何通过查询无参数、单参数、多参数的API灵活地从数据库中获取数据?
发布于 2018-12-04 04:11:56
所以,你不能真的像那样做路由。“可选”路由参数的概念与路径参数不能很好地配合使用。例如,如果您想要指定模型,您需要输入类型和年份,而不能只搜索现有的模型。
如果您必须对路径执行此操作,则需要以与粒度相反的顺序定义三个路由:
router.get('/articles/:type/:year/:model', api_controller.articles);
router.get('/articles/:type/:year', api_controller.articles);
router.get('/articles/:type', api_controller.articles);我不确定你的查询是否正确,因为你没有共享你的数据结构,但一般来说,如果你尝试匹配null,mongodb会忽略参数,所以我认为你已经设置好了。
现在,如果是我,我根本不会在path上匹配。相反,我只使用查询字符串作为搜索参数,如下所示:
router.get('/articles', api_controller.articles);然后在控制器中:
// now someone calls /articles?year=2017&type=whatever or could call /articles?model=some-name
exports.articles = async (req, res, next) => {
const articles = await Article.find({
'models': {
$elemMatch: {
'year': req.query.year,
'category': req.query.type,
'name': req.query.model,
}
}
});
res.send(articles);
}https://stackoverflow.com/questions/53600807
复制相似问题