Iron Route - 服务器端,从onBeforeAction()访​​问this.params

时间:2017-08-31 21:37:48

标签: meteor iron-router

我需要从我的流星应用程序中提供一些REST API端点 端点必须可以在服务器端访问,所以我使用Iron路由器进行服务器端路由 一切都很好,但现在我需要访问this.params进行权限检查。

我目前的路线:

Router.route('myServerRoute', {
    where: "server",
    path: '/api/v1/doit/:partner',
    onBeforeAction: function(req, res, next) {
        API.beforeAction(req, res, next, ['admin','API']);
    }
})

API.beforeAction 是我用来验证用户令牌的函数(此令牌位于其中一个标题中)
如果令牌有效且该用户具有第4个参数中的一个角色,则此函数检查

:partner是使用API​​的合作伙伴的名称。

假设:partner'store1'/api/v1/doit/store1
我想验证只有store1角色的用户是否能访问/api/v1/doit/store1网址
所以我想将:partner参数的值传递给API.beforeAction函数

onBeforeAction功能上,我无法访问 this.params(它是空的)
有人建议使用Router.current()来访问参数 但这是客户端调用,并且它不可用于服务器端。

我可以使用req.url,解析它并获取合作伙伴名称。但是当我知道Iron Route已经解析了这个URL

时,我不喜欢自己解析

有关如何在onBeforeAction内获取网址参数的任何建议吗?

1 个答案:

答案 0 :(得分:1)

您不需要在onBeforeAction中执行权限检查。我用Iron Router实现了我的API。 在下面的示例中,我使用API​​密钥处理get请求并返回信息或错误代码。

Router.route('/api/thing/:apikey', { where: 'server' })
.get(function getThing () {
    if (typeof this.params.apikey === 'undefined' || this.params.apikey.length != 16 || !Userprofile.findOne({ apiKey: this.params.apikey })) {
        this.response.statusCode = 403;
        return this.response.end('Not authorized');
    }
    const things = Thing.find({ owner: Userprofile.findOne({ apiKey: this.params.apikey }).owner }).fetch();
    if (things.length > 0) {
        this.response.statusCode = 200;
        return this.response.end(JSON.stringify(things));
    } else {
        this.response.statusCode = 200;
        return this.response.end('No things found');
    }
});