在Loopback中构建API时,我希望拥有相对平坦的,受身份验证的路由,例如:/users
,/orders
等。所以,如果我是用户并且我有一些订单,我应该只需致电/orders
或/orders/:id
即可获得一个或多个我的帐户订单。
使用Loopback的模型关系,我可以相对轻松地执行类似/users/:userId/orders
的操作,但肯定有一些情况我不想在URL结构中添加这种复杂性。< / p>
有没有一种好的,推荐的方法来做这样的事情?似乎应该有一种方法来设置它,以便当前用户的访问令牌告诉Loopback它有权访问哪些记录,然后只返回那些。
答案 0 :(得分:1)
if($_SERVER["REMOTE_ADDR"]=="::1"){
echo 'local';
$conn = new mysqli($servername, $username, $password, $dbname, 3306, "/173.194.xxx.xxx/myappname:mydbinstance");
}else{
$local = False;
echo 'app engine';
$conn = new mysqli(null, $username, $password, $dbname, null, "/cloudsql/myappname:mydbinstance");
}
,例如
您应该为您的情况创建一个/users/:userId/orders
的基本路线。
答案 1 :(得分:1)
这个问题的解决方案并不是非常明显,但我想出了一些运作良好的东西,虽然它有点“手动”。
首先,就我而言,我始终可以通过req.user
访问用户,这是一种相当常见的Node.js / Express模式。我相信像Passport这样的库也会遵循这一点。
然后,我创建了一个名为的通用辅助方法,如下所示:
module.exports.sourceUser = function(ctx) {
var req = ctx.req;
if (!req.user) {
var err = new Error('You must pass valid credentials to call this API.');
err.statusCode = 401;
throw err;
}
return req.user;
};
这将确保我附加此方法的API将需要用户身份验证,拒绝任何没有有效用户信用的请求。
接下来,由于我正在定义平面API,我只是定义自己的远程方法(不使用内置的Loopback方法)。每个远程方法def看起来像这样:
Model.remoteMethod('getRecord', {
http: {
verb: 'get',
path: '/:id'
},
accepts: [
{ arg: 'id', type: 'string', required: true, http: { source: 'path' } },
{ arg: 'user', type: 'object', http: helpers.sourceUser }
],
returns: [
{ arg: 'model', type: 'model', root: true }
]
});
您需要调整该代码以匹配您的模型名称等。另外,请注意helpers.sourceUser
的用法,这是确保我们拥有用户然后将该用户作为参数提供给API实施。
最后,我在数据库查询等中使用where
子句,以确保用户只获取/设置自己的记录(例如where model.user == user.id
)。
希望这有助于其他人...