Access Meteor.userId from outside a method/publish

前端 未结 2 367
悲&欢浪女
悲&欢浪女 2020-12-11 12:39

I\'m currently writing a server-centric package for Meteor, and the relevant code looks something like this:

__meteor_bootstrap__.app.stack.unshift({
    rou         


        
相关标签:
2条回答
  • 2020-12-11 13:26

    The thing that you need to target first is that to get something that can identify the user from headers (especially because you want to get the username at a point where no javascript can run).

    Meteor stores session data for logins in localStorage, which can only be accessed via javascript. So it can't check who is logged in until the page has loaded and the headers have been passed.

    To do this you need to also store the user data as a cookie as well as on localStorage:

    client side js - using cookie setCookie and getCookie functions from w3schools.com

    Deps.autorun(function() {
        if(Accounts.loginServicesConfigured() && Meteor.userId()) {
            setCookie("meteor_userid",Meteor.userId(),30);
            setCookie("meteor_logintoken",localStorage.getItem("Meteor.loginToken"),30);
        }
    });
    

    server side route

    handle: function (req,res, next) {
        //Parse cookies using get_cookies function from : http://stackoverflow.com/questions/3393854/get-and-set-a-single-cookie-with-node-js-http-server
        var userId = get_cookies(req)['meteor_usserid'];
        var loginToken = get_cookies(req)['meteor_logintoken'];
    
        var user = Meteor.users.findOne({_id:userId, "services.resume.loginTokens.token":loginToken});
    
        var loggedInUser = (user)?user.username : "Not logged in";
    
        res.writeHead(200, {'Content-Type': 'text/json'});
        res.end("Print current user here - " + loggedInUser)
        return;
    }.future ()
    

    The cookie allows the server to check who is logged in before the page is rendered. It is set as soon as the user is logged in, reactively using Deps.autorun

    0 讨论(0)
  • 2020-12-11 13:26

    My solution was inspired by the server part of @Akshat's method. Since I'm making a RESTful API, I just pass the userId/loginToken in every time (either as a param, cookie or header).

    For anyone interested, I bundled it as a package: https://github.com/gkoberger/meteor-reststop

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