在环回中构build“平坦”API
当在loopback中构build一个API时,我想要有相对平坦的,受到身份validation保护的路由,例如: /users
, /orders
等。所以,如果我是用户并且有一些命令,我应该可以简单地调用/orders
或/orders/:id
来获取我的账户中的一个或多个订单。
使用Loopback的模型关系,我可以比较容易地执行如下操作: /users/:userId/orders
,但肯定会出现这种情况,我不想在URL结构中增加复杂性。
有没有一个好的,build议的方式来做这样的事情? 似乎应该有一种方法来设置,使当前用户的访问令牌告诉Loopback它有权访问的logging,然后只能返回这些。
/users/:userId/orders
是需要pipe理区域例如你应该创build一个基本路线这样/me
为你的情况。
这个问题的解决scheme并不是非常明显,但是我想出了一些足够好的方法,尽pipe它有点“手动”。
首先,就我而言,我总是可以通过req.user
访问用户,这是一个相当常见的Node.js / Express模式。 我相信Passport这样的libs也会跟着这个。
然后,我创build了一个名为的通用帮助器方法,如下所示:
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将需要用户身份validation,拒绝任何请求,没有一个有效的用户信誉。
接下来,由于我正在定义平坦的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
子句,以确保用户只获取/设置自己的logging(例如where model.user == user.id
)。
希望这可以帮助别人…