建立一个平坦的"环回API

时间:2015-11-30 00:20:26

标签: node.js loopbackjs

在Loopback中构建API时,我希望拥有相对平坦的,受身份验证的路由,例如:/users/orders等。所以,如果我是用户并且我有一些订单,我应该只需致电/orders/orders/:id即可获得一个或多个我的帐户订单。

使用Loopback的模型关系,我可以相对轻松地执行类似/users/:userId/orders的操作,但肯定有一些情况我不想在URL结构中添加这种复杂性。< / p>

有没有一种好的,推荐的方法来做这样的事情?似乎应该有一种方法来设置它,以便当前用户的访问令牌告诉Loopback它有权访问哪些记录,然后只返回那些。

2 个答案:

答案 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)。

希望这有助于其他人...