Express?中的多个可选查询参数



我正在使用Express,我有一个路由,使GET请求我的'挑战'收集MongoDB。这将根据分段号和挑战号找到一个特定的挑战。

我的代码如下:
// @route           GET api/challenge?section=_&challenge=_
// @description     Get challenge by section number and challenge number
// @access          Private
router.get('/', auth, async (req, res) => {
try {
const challenge = await Challenge.find({
section_no: req.query.section,
challenge_no : req.query.challenge,
});
if (!challenge) {
return res.status(400).json({ msg: 'Challenge not found' });
}
return res.json(challenge);
} catch (err) {
console.error(err.message);
res.status(500).send('Server Error');
}
});

现在在Postman上查询它可以正常工作。当我输入两个查询参数值'section' &'challenge'我得到想要的结果,它能够返回特定的挑战数据。

但我的问题是:

我如何修改这段代码,以便我可以选择只查询section或两个section &挑战。例如,如果我要查询以下内容:

api/challenge?section=1

它将返回section 1中所有挑战的所有数据

但是我仍然希望能够通过使用查询返回一个特定的挑战:

api/challenge?section=1&challenge=1

它会返回section 1中第一次挑战的所有数据

提前感谢!

您可以创建一个过滤器对象,在其中放置查询字符串,如果存在,代码如下:

router.get('/', auth, async (req, res) => {
try {
const filter = {};
if (req.query.section) filter.section_no = req.query.section;
if (req.query.challenge) filter.challenge_no = req.query.challenge;
const challenge = await Challenge.find(filter);
if (!challenge) {
return res.status(400).json({ msg: 'Challenge not found' });
}
return res.json(challenge);
} catch (err) {
console.error(err.message);
res.status(500).send('Server Error');
}
}); 

另一种选择是使用扩展操作符,因为键与数据库查询相同:

router.get('/', auth, async (req, res) => {
try {
const challenge = await Challenge.find({
...req.query,
});
if (!challenge) {
return res.status(400).json({ msg: 'Challenge not found' });
}
return res.json(challenge);
} catch (err) {
console.error(err.message);
res.status(500).send('Server Error');
}
});

在本例中,请注意查询应该具有关键字"challenge_no"one_answers";section_no"或者,反过来,查询应该支持"挑战"。和";section"查询对象中的键。

最新更新