我正在后台使用Sails.js开发一个应用程序,在验证以下请求时遇到问题:
我想根据登录用户的属性阻止对某些资源的访问。我启用了REST API蓝图,禁用了快捷路线。我有以下代码:
User.findOne()
.where(query)
.exec(function(err, user) {
if (user.team !== req.user.team) {
return res.view('403');
}
return next();
});
其中query
是我想要进行数据库搜索的标准。其想法是,只有当请求的用户在同一个"团队"中时,用户才能访问他们。
问题是,用户至少可以向后端发出以下类型的请求,也许更多(我对帆没有太多经验,如果有更多类型,请告诉我):
localhost:1337/user?id=1
在这种情况下,req
对象将具有req.query
属性,我可以将其原样传递为query
localhost:1337/user/1
这里req.query
将是一个空对象,而req.params
是[ id: '1']
。现在这很麻烦;如果我理解正确的话,req.params
的类型不是JSON对象,所以我不能按query
的形式传递它。此外,由于某种原因,我必须将id
参数转换为Int,因为它最初是一个字符串(?)。
我想问的是,我是否错过了以相同方式处理这两种请求的方法,或者我是否必须像一样将这两种情况都考虑在内
var query = isEmpty(req.query) ? req.params : req.query
在这种情况下,我必须将req.params
转换为可以传递给数据库搜索的东西,这通常会很麻烦和不方便。我想知道处理这种情况的最佳方法是什么。
有趣的是,在发布问题后,你碰巧找到了答案。据官方文档介绍,显然有一个名为req.allParams()
的函数"包括从url路径、查询字符串和请求体解析的参数"。我不知道我以前怎么从来没有遇到过这种情况,但现在我遇到了,而且它似乎起了作用,太棒了!