在环回中构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 )。

希望这可以帮助别人…