expressjs:处理多个可选路由参数的最佳方法

时间:2016-03-11 19:11:45

标签: node.js express router

我使用nodejs Express。我想有一个接收id或用户名的路由器作为请求参数,如下所示:

router.get('/:id?/:username?', authMiddleware, function (req, res, next) {
    models
    .User
    .findAll({
        where: {
            $or: {
                id: req.params['id'],
                username: req.params['username']
            }
        }
    })
    .then(function (rows) {
        res.send(rows);
    })
}

然而,快递似乎不理解我的要求: http://localhost:3000/api/1.0/users//david

我想通过用户名而不是id

来查询用户

现在唯一可行的方法是将路由定义为:/:id_or_username,如下所示:

router.get('/:id_or_username', function (req, res, next) {
    models
    .User
    .findAll({
        where: {
            $or: {
                id: req.params['id_or_username'],
                username: req.params['id_or_username']
            }
        }
    })
    .then(function (rows) {
        res.send(rows);
    })
}

但它有点脏,我对这段代码不满意。 在这种情况下,使用REST样式而不是:idOrName param?

可以定义路由器

2 个答案:

答案 0 :(得分:1)

我不确定你的系统是如何设置的,但这对于req.query而不是req.param更好用。

当你不确定输入是什么时,你应该使用req.query,并在传递你肯定会在那里的信息时使用req.param。 req.param可能有一种方法可以做到这一点,但我不确定我能想到你为什么要这样做的原因。

通过这种方式,您可以执行以下操作:

action = "/users/"+ id ? id : username

然后req.query为它。

答案 1 :(得分:1)

假设您的ID为int,您可以执行以下操作:

router.get('/:id_or_username', function (req, res, next) {
    var where = {}
    var param = req.params['id_or_username']

    if (isNaN(param)) {
      where.username = param
    } else {
      where.id = param
    }
    models.User.findAll({where}).then(function (rows) {
        res.send(rows)
    })
}

现在,您可以使用相同的参数

发送idusername