How to get Meteor.user() to return on the server side?

前端 未结 4 1234
名媛妹妹
名媛妹妹 2020-12-13 06:50

in a file called /server/main.js (in order to ensure it is loaded last).

console.dir(Meteor.user());

Throws:

Error: Meteor.         


        
相关标签:
4条回答
  • 2020-12-13 07:15

    You can use the logged in callback

    Accounts.onLogin((obj)->
      user = ob.user
    )
    
    Accounts.onLogin(function(obj){
      var user = ob.user
    })
    
    0 讨论(0)
  • 2020-12-13 07:16

    You can expose the userId with Meteor.publish() to global scope. Then you can use it with Meteor.Router's server side routes.

    --

    /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...
    });
    
    0 讨论(0)
  • 2020-12-13 07:19

    You have to use Meteor.user() in a place where a request is made from the client (such as a Meteor.methods or a Meteor.publish).

    It can't be placed anywhere else because meteor wouldn't know at that point in the code the user is supposed to bound to. If there is a place a request of some form is made from the client it can do this:

    In a 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();
        }
    });
    

    In a Meteor.methods:

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

    To use Meteor.user() on a server side route:

    You need Meteor router installed as a package via meteorite to allow you to have a server rendered page. (installed via mrt install router)

    A server side route could then handle the web request:

     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"
             }
         }
     });
    

    So now when you visit /awebpage it would check whether the user is logged in and do the thing you want when they are logged in. Initially there is a redirect to relay the data from localstorage back to the URI.

    0 讨论(0)
  • 2020-12-13 07:32

    I recently wrote a blog post describing solution to this: https://blog.hagmajer.com/server-side-routing-with-authentication-in-meteor-6625ed832a94.

    You basically need to set up a server route using a https://atmospherejs.com/mhagmajer/server-router package and you can get current user with this.userId just like with Meteor methods.

    0 讨论(0)
提交回复
热议问题