Итак, вы не можете делать маршрутизацию именно так.Концепция «необязательных» параметров маршрута плохо работает с параметрами пути.Например, вы не можете осуществлять поиск только по той модели, которая у вас есть, если вы хотите указать модель, которую вам необходимо указать тип и год, вам наверняка нужно.
Если вы должны сделать это с путем, то вам нужно определить три маршрута в обратном порядке детализации:
router.get('/articles/:type/:year/:model', api_controller.articles);
router.get('/articles/:type/:year', api_controller.articles);
router.get('/articles/:type', api_controller.articles);
Не уверен, что ваш запрос правильный, так как вы не сделали 'Я не могу поделиться своей структурой данных, но в целом, если вы попытаетесь найти совпадение на нуле, mongodb проигнорирует этот параметр, так что я думаю, что вы настроили его.
Теперь, если бы это был я, я бы вообще не подходил по пути.Вместо этого я бы просто использовал строку запроса для параметров поиска, например:
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);
}