Как вернуть 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 просто отлично, читать/устанавливать свойства пользователя и т.д. Сервер четко знает пользователя, а текущий пользователь четко вошедший в систему.

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

4 ответа

Вы должны использовать 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>";
 }
 else
 {
 return "Not logged in"
 }
 }
 });

Итак, теперь, когда вы посещаете /awebpage, он проверяет, вошел ли пользователь в систему и выполнит ли что-то, что вам нужно, когда он войдет в систему. Первоначально существует перенаправление для ретрансляции данных из localstorage обратно в URI.


Вы можете открыть 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...
});


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

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


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

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

licensed under cc by-sa 3.0 with attribution.