5

数週間前から Sails を使用しています。Rails 出身で、Node.js を使用した経験はありません。

現在、jsonwebtoken を使用して堅牢なトークン認証を作成しようとしています。 https://github.com/auth0/node-jsonwebtoken

このガイドhttp://thesabbir.com/how-to-use-json-web-token-authentication-with-sails-js/に従いましたが、すべて正常に機能しました。サインアップしてサインインし、トークンをさまざまなアクションに正しく使用できます。

今、ログインユーザーを使用したいアクションがいくつかあります.devisecurrent_userヘルパーのようなものです。たとえば、コメントを作成する場合、このコメントは現在のユーザーに属している必要があります。

Sabbir Ahmed ガイドを使用すると、isAuthorized.js ポリシーの 33 行目でトークンが復号化されるため、そこから現在のユーザー ID を取得できます。

それで、私の質問は、現在のユーザーを取得し、後でコントローラーで使用できるようにするための最良の方法は何ですか? たとえば、次のようなことを試しました:

# isAuthorized.js line 34, after getting decrypted token
User.findOne({id: token.id}).exec(function findOneCB(err, found){
    currentUser = found;
});

しかし、この方法では、これは非同期アクションであるため、コントローラーでこの currentUser を使用することはできません。

ヘルパーやサービスなど、各コントローラーで同じコードを繰り返さずに、後でコントローラーで使用できるように、現在のユーザーを保存したいと考えています。

4

2 に答える 2

4

トリックは、あなたが配置する場所next()です。非同期呼び出しを行っているため、データベース アクションが完了したら、制御を次のポリシー/コントローラーにのみ転送する必要があります。

ポリシーを次のように変更する必要があります。

User.findOne({id: token.id}).exec(function findOneCB(err, found){
    if(err) next(err);
    req.currentUser = found;
    next();
});

isAuthorizedそして、ポリシーを使用するコントローラーでユーザーの詳細にアクセスできるはずですreq.currentUser

于 2016-01-31T08:07:49.880 に答える