Javascript 从方法/发布外部访问Meteor.userId

Javascript 从方法/发布外部访问Meteor.userId,javascript,meteor,Javascript,Meteor,我目前正在为Meteor编写一个以服务器为中心的包,相关代码如下所示: __meteor_bootstrap__.app.stack.unshift({ route: route_final, handle: function (req,res, next) { res.writeHead(200, {'Content-Type': 'text/json'}); res.end("Print current user here");

我目前正在为Meteor编写一个以服务器为中心的包,相关代码如下所示:

__meteor_bootstrap__.app.stack.unshift({
    route: route_final,
    handle: function (req,res, next) {
        res.writeHead(200, {'Content-Type': 'text/json'});
        res.end("Print current user here");
        return;
    }.future ()
});
这显然是一种相对粗糙的方法,但我需要创建一个RESTful API

如何从这里访问Meteor.userId()?文件说,它只能从方法或发布内部访问。有什么办法吗

我尝试过的事情:

  • 使用Meteor.publish(“user”,function(){user=this.userId()})从发布中捕获它
  • 从cookies中获取token+用户id,并使用类似于
    Meteor.users.findOne({u id:userId,“services.resume.loginTokens.token”:logintoken})的东西亲自验证它
  • 创建一个名为
    get\u user\u id
    的方法,并从下面的“我的代码”中调用它

您首先需要瞄准的是,从标题中获取能够识别用户的内容(特别是因为您希望在无法运行javascript的情况下获取用户名)

Meteor将登录的会话数据存储在
localStorage
中,该存储只能通过javascript访问。因此,在加载页面并传递标题之前,它无法检查谁登录

为此,您还需要将用户数据存储为cookie以及
localStorage

客户端js-使用w3schools.com上的cookie
setCookie
getCookie
函数

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

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 ()

cookie允许服务器在呈现页面之前检查谁已登录。一旦用户登录,就会使用
Deps.autorun

进行设置。我的解决方案受@Akshat方法的服务器部分启发。因为我正在制作一个RESTful API,所以每次都只需传递userId/loginToken(作为参数、cookie或头)


对于感兴趣的人,我将其打包为一个包:

应该是
“services.resume.loginTokens.token”:loginToken})?我得到了一个未定义的setCookie,这仍然有效吗?顺便说一句,这不再有效,因为现在用户帐户内部持有hashedToken,不再具有loginToken