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)
})
}
现在您可以使用相同的参数发送 id
或 username
我正在使用 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)
})
}
现在您可以使用相同的参数发送 id
或 username