我是Node.js和Express的新手,我想知道以下代码是否正确:
router.get('students/:name', async (req, res) => {
const students = await Student.find(req.params.name);
res.send(students);
});
router.get('students/:age', async (req, res) => {
const students = await Student.find(req.params.age);
res.send(students);
});
那么Express怎么能找出只使用一个参数的一条路线呢?例如,当我打电话给localhost:3000/students/20
时,如果有些学生20岁,而有些学生的名字是“ 20”怎么办?
答案 0 :(得分:2)
您应该在这种情况下使用req.query。像:/students?name=john&age=25
router.get('/students', async (req, res) => {
let query = req.query; // {name: 'john',age:25}
const students = await Student.find(query);
res.send(students);
});
答案 1 :(得分:1)
您可以使用regex for route matching:
router.get('students/:age([0-9]+)', async (req, res) => {
const studentAge = parseInt(req.params.age, 10);
const students = await Student.find({age: studentAge});
res.send(students);
});
// Handle other strings
router.get('students/:name', async (req, res) => {
const students = await Student.find({name: req.params.name});
res.send(students);
});
答案 2 :(得分:0)
据我所知,Express使用的是第一种与您的URL模式匹配的方法,而无需区分路由参数的类型。
这意味着在您的代码中,您将始终使用第一个,最顶层的方法。
为了能够同时使用名称过滤器和年龄过滤器,您将必须使用query参数或将字符串化的JSON传递到包含两个过滤器的路由。不过,前者会更优雅一些,从而减少URL的过载。 JSON往往会变大。