Подтвердить что ты не робот

Как вернуть 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, кроме 'cookie:' uvf = 1 ''

Я не уверен, что заключить - это бессмысленно, поскольку я могу в противном случае использовать структуру Meteor.Account просто отлично, читать/устанавливать свойства пользователя и т.д. Сервер четко знает пользователя, а текущий пользователь четко вошедший в систему.

У меня полная потеря, любое объяснение/подсказка/указатель будут очень благодарны.

4b9b3361

Ответ 1

Вы должны использовать Meteor.user() в месте, где запрос делается от клиента (например, Meteor.methods или Meteor.publish).

Он не может быть помещен нигде, потому что метеорит не знал бы в тот момент в коде, к которому должен привязываться пользователь. Если есть какое-то место, клиенту может быть запрошена какая-либо форма, он может это сделать:

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

Затем серверный маршрут может обрабатывать веб-запрос:

 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.

Ответ 2

Вы можете открыть userId с помощью Meteor.publish() для глобальной области. Затем вы можете использовать его с маршрутами на стороне сервера 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

Вы можете использовать зарегистрированный обратный вызов

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

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

Ответ 4

Недавно я написал сообщение в блоге, описывающее это решение: https://blog.hagmajer.com/server-side-routing-with-authentication-in-meteor-6625ed832a94.

Вам в основном нужно настроить маршрут сервера с помощью https://atmospherejs.com/mhagmajer/server-router, и вы можете получить текущего пользователя с помощью this.userId с метеорными методами.