快速路线参数

时间:2019-08-21 16:20:14

标签: node.js rest express

我是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”怎么办?

3 个答案:

答案 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往往会变大。