web-dev-qa-db-ja.com

Meteor.user()をサーバー側に戻す方法は?

/server/main.jsというファイルに(最後に読み込まれるようにするため)。

console.dir(Meteor.user());

スロー:

Error: Meteor.userId can only be invoked in method calls. Use this.userId in publish functions.

だから私は同じファイルで使用しようとします:

console.dir(this.userId);

戻り値:

undefined

だから、あきらめずに、「ヘッダーのCookieから読んでいい」と考えています。

var connect = Npm.require('connect');

__meteor_bootstrap__.app.use(connect.query()).use(function(req, res, next) {
    console.dir(req.headers);
    next();
});

.... 'cookie:' uvf = 1 ''を除き、Cookieに関しては何も返しません

結論はわかりませんが、Meteor.Accountフレームワークをうまく使用したり、ユーザープロパティを読み取ったり設定したりできるため、これは無意味です。サーバーはユーザーを明確に認識しており、現在のユーザーは明確にログインしています。

私は完全に迷っています、どんな説明/ヒント/ポインタも大歓迎です。

37
Stephan Tual

クライアントから要求が行われる場所(Meteor.methodsやMeteor.publishなど)でMeteor.user()を使用する必要があります。

流星は、ユーザーがバインドされることになっているコードのその時点ではわからないため、他の場所に配置することはできません。クライアントから何らかの形式のリクエストが行われる場所がある場合、これを行うことができます:

Meteor.publishで:

Meteor.publish("collection", function() {
    //returns undefined if not logged in so check if logged in first
    if(this.userId) {
        var user = Meteor.users.findOne(this.userId);
        //var user is the same info as would be given in Meteor.user();
    }
});

Meteor.methodsの場合:

Meteor.methods({
    "test":function() {
        //should print the user details if logged in, undefined otherwise.
        console.log(Meteor.user());
    }
}

サーバー側のルートでMeteor.user()を使用するには:

Meteor router パッケージとして meteorite を介してインストールし、サーバーでページをレンダリングできるようにする必要があります。 (mrt install router経由でインストール)

サーバー側のルートは、Webリクエストを処理できます。

 Meteor.Router.add('/awebpage', function(id) {
     var userId = this.params.userid;
     var logintoken = this.params.logintoken;
     var isdirect = this.param.direct;
     var user = Meteor.users.findOne({_id:userId,"services.resume.loginTokens.token":logintoken});
     if(user) {
         //the user is successfully logged in

         return "You, "+user.profile.name+", are logged in!";
     }
     else
     {
         if(isdirect) {
             return "<h3>Loading</h3><script>window.location.href="/awebpage?direct=true&userid="+localStorage.getItem("Meteor.userId") +"&logintoken="+localStorage.getItem("Meteor.loginToken")</script>";
         }
         else
         {
             return "Not logged in"
         }
     }
 });

したがって、/awebpageにアクセスすると、ユーザーがログインしているかどうかを確認し、ログインしたときに必要な処理を実行します。最初に、localstorageからURIにデータをリレーするリダイレクトがあります。

53
Akshat

Meteor.publish()でuserIdをグローバルスコープに公開できます。その後、Meteor.Routerのサーバー側ルートで使用できます。

-

/server/publications.js

CurrentUserId = null;
Meteor.publish(null, function() {
    CurrentUserId = this.userId;
});

-

/server/routes.js

Meteor.Router.add('/upload', 'POST', function() {
    if (!CurrentUserId)
        return [403, 'Forbidden'];

    // proceed with upload...
});
3
user2139950

ログインしたコールバックを使用できます

Accounts.onLogin((obj)->
  user = ob.user
)

Accounts.onLogin(function(obj){
  var user = ob.user
})
2
Nath