Node.js 建筑a";“平坦”;环回中的API

Node.js 建筑a";“平坦”;环回中的API,node.js,loopbackjs,Node.js,Loopbackjs,在环回中构建API时,我希望有相对平坦的、受身份验证保护的路由,如:/users、/orders,等等。因此,如果我是用户并且我有一些订单,我应该能够简单地调用/orders或/orders/:id,为我的帐户获取一个或多个订单 使用Loopback的模型关系,我可以相对轻松地执行如下操作:/users/:userId/orders,但在某些情况下,我肯定不想将这种复杂性添加到URL结构中 有没有一个好的,推荐的方法来做这样的事情?似乎应该有一种方法来设置它,以便当前用户的访问令牌告诉环回它有权

在环回中构建API时,我希望有相对平坦的、受身份验证保护的路由,如:
/users
/orders
,等等。因此,如果我是用户并且我有一些订单,我应该能够简单地调用
/orders
/orders/:id
,为我的帐户获取一个或多个订单

使用Loopback的模型关系,我可以相对轻松地执行如下操作:
/users/:userId/orders
,但在某些情况下,我肯定不想将这种复杂性添加到URL结构中


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

/users/:userId/orders
是管理区域所需的,例如
你应该为你的情况创建一个基本路线,比如
/me

这个问题的解决方案不是很明显,但我想出了一个很好的方法,尽管有点“手动”

首先,在我的例子中,我总是可以通过
req.user
访问用户,这是一种相当常见的Node.js/Express模式。我相信像Passport这样的LIB也遵循这一点

然后,我创建了一个名为的通用帮助器方法,如下所示:

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;
};
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 }
    ]
});
这将确保我附加此方法的API需要用户身份验证,拒绝任何没有有效用户凭据的请求

接下来,由于我定义的是平面API,所以我只定义自己的远程方法(不使用内置环回方法)。每个远程方法定义如下所示:

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;
};
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


希望这能帮助其他人…

这是一个很好的问题。我认为将其集成到环回中将消除API的复杂性。