2017-08-31 10 views
0

私の流星アプリケーションからいくつかのREST APIエンドポイントを提供する必要があります。
エンドポイントはサーバー側でアクセスできる必要があります。そのため、サーバー側ルーティングにIronルーターを使用しています。
素晴らしい作品ですが、許可チェックのためthis.paramsにアクセスする必要があります。Iron Route - サーバー側、onBeforeAction()から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は、私はユーザートークンを検証するために使用している機能である(このトークンは、ヘッダーの1つである)
このトークンが有効で、そのユーザーが第4パラメータのロールのいずれかを持っている場合は、機能チェックを使用します。

:partnerは、APIを使用するパートナーの名前です。

レッツは
は、だから私は:partnerパラメータの値を渡したい:partnerは私がstore1役割
を持ってユーザーのみが/api/v1/doit/store1 URLにアクセスすることができますことを確認したい'store1'/api/v1/doit/store1
であると言いますonBeforeAction機能にAPI.beforeAction機能

に私はthis.paramsへのアクセスを持っていない(空の)
一部は、Router.current()
を使用してパラメータにアクセスすることを提案しましたが、これはクライアントコールであり、サーバー側では使用できません。

req.urlを使用して解析し、パートナー名を取得できます。 Iron Routeで既にこのURLが解析されていることがわかったときに解析するのは好きではありません

onBeforeActionのURLパラメータを取得する方法を教えてください。

+0

珍しい、[フックに鉄ルータガイド部(http://iron-meteor.github.io/iron-router/#using-hooksルート関数の使用可能なすべての特性も利用可能である」と言いますここでthis.params " –

+0

@MichelFloyd、はい、私もそう思っていました... [console.log(" params: "、JSON.stringify(this.params、null、2)); ] "this.params"はクライアント側ルーティングでのみ利用可能と思われます – Izack

+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'); 
    } 
}); 
+0

私のAPIエンドポイントのいくつかについてはPOST、GET、PUT、DELETEを持っています... 4つの異なる機能は、間違いを招くでしょう。 もう1つは、ログとアラートにonBeforeActionを使用していることです。このようにして、すべてのAPIリクエストで同じ種類のログが取得され、ログサプライヤを切り替える必要がある場合は、変更する場所は1つだけです – Izack

関連する問題