web-dev-qa-db-fra.com

Comment faire pour que Meteor.user () revienne côté serveur?

dans un fichier appelé /server/main.js (afin de s'assurer qu'il est chargé en dernier).

console.dir(Meteor.user());

Jette:

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

J'essaye donc d'utiliser, dans le même fichier:

console.dir(this.userId);

résultats:

undefined

donc, n'abandonnant pas, je pense "ça va, je vais juste lire les cookies dans l'en-tête":

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

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

.... ne renvoie rien en termes de cookies sauf pour 'cookie:' uvf = 1 ''

Je ne sais pas quoi conclure - cela n'a aucun sens car je peux sinon utiliser le cadre Meteor.Account très bien, lire/définir les propriétés de l'utilisateur, etc. Le serveur est clairement au courant de l'utilisateur et l'utilisateur actuel est clairement connecté.

Je suis complètement perdu, toute explication/indice/pointeur serait grandement apprécié.

37
Stephan Tual

Vous devez utiliser Meteor.user () dans un endroit où une demande est faite du client (comme Meteor.methods ou Meteor.publish).

Il ne peut pas être placé ailleurs car météore ne saurait pas à ce stade du code auquel l'utilisateur est censé se lier. S'il y a un endroit, une demande d'une forme quelconque est faite du client, il peut le faire:

Dans un 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();
    }
});

Dans un Meteor.methods:

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

Pour utiliser Meteor.user () sur une route côté serveur:

Vous avez besoin de Meteor router installé en tant que package via meteorite pour vous permettre d'avoir une page rendue par le serveur. (installé via mrt install router)

Un itinéraire côté serveur pourrait alors gérer la demande 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"
         }
     }
 });

Alors maintenant, lorsque vous visitez /awebpage il vérifierait si l'utilisateur est connecté et ferait ce que vous voulez lorsqu'il est connecté. Initialement, il existe une redirection pour relayer les données de localstorage vers l'URI.

53
Akshat

Vous pouvez exposer l'ID utilisateur avec Meteor.publish () à une portée globale. Ensuite, vous pouvez l'utiliser avec les routes côté serveur de 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

Vous pouvez utiliser le rappel connecté

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

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