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

expressjs: Best way to handle multiple optional route params

我正在使用 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 参数来定义路由器?

我不确定您的系统是如何设置的,但这听起来更适合 req.query 而不是 req.param。

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

这样您就可以执行如下操作:

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

然后req.query。

假设您的 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