我正在使用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"查询对象中的键。