8

Próbowałem szukać odpowiedzi na wszystkie strony, ale nie wydaje się, aby to działało. Używam Meteora z Cordova, aby zbudować aplikację mobilną.Meteor: W jaki sposób zaktualizować kolekcję Użytkownicy, aby dodać nowy atrybut do obiektu/słownika?

Chcę dodać atrybut do mojej kolekcji Użytkownicy (ten, który Meteor tworzy po zalogowaniu). to znaczy. Na przykład chcę dodać {currentHotel: "Something"} do mojej kolekcji db.Users.

Próbuję zrobić to w prawidłowy sposób, Opublikuj - Subskrybuj. Używanie Meteor.methods zostało zacytowane, aby nie było dobre dla aplikacji działających w czasie rzeczywistym. Tak czy inaczej, chcę zrozumieć, jak zaktualizować kolekcję Użytkownicy za pomocą Opublikuj - Subskrybuj.

//On the server, I did 
Meteor.publish("userData", function() { 
    return Meteor.users.find({_id: this.userId}, 
     {fields:{services: 1, currentHotel: 1}}); 
}); 

Tak więc pole currentHotel powinno być dostępne po stronie klienta. Teraz, aby zaktualizować „currentHotel” murawę:

//On the client I do 
Meteor.subscribe('userData'); 
var user = Meteor.users.findOne({"_id": Meteor.userId()}); 
Meteor.users.update({_id: user._id}, {$set:{currentHotel:'something'}}); 

//I tried this too 
//Meteor.users.update({ _id: Meteor.userId() }, {$set: }); 

Na konsoli przeglądarki widzę „currentHotel” i „usługi” dobrze, co oznacza, publikowania-subskrybowania pracował. Jednak nie mogę zaktualizować currentHotel. Otrzymuję odmowę dostępu. Dlaczego to?

Dodatkowo, jeśli właściwość "currentHotel" w ogóle nie istniała w kolekcji, w jaki sposób mogę ją dodać za pomocą podobnej subskrypcji do publikacji? Czy mogę opublikować właściwość, której nie ma i zezwolić klientowi na subskrypcję i dodanie tej właściwości?

Odwołałem się do dokumentów Meteor, this, this i this, ale nadal nie mogę sprawić, żeby działało! :-(

góry dzięki

Odpowiedz

7

Nie powinno się zmienić pola administratora obiektu użytkownika:

Meteor.users.update(user, {$set: {"profile.currentHotel": "something"}}); 

Czytaj więcej tutaj: http://docs.meteor.com/#/full/meteor_users

EDIT: Ta odpowiedź stało się nieistotne, jak pokazano w najnowszej dokumentacji: https://guide.meteor.com/accounts.html#dont-use-profile

Ta odpowiedź jest starsza niż 1 rok :) Jak się okazuje, forci ng, aby zapisywać pola specyficzne dla użytkownika w polu "profil" jako poważne konsekwencje dla bezpieczeństwa (jak zawsze myślałem), ponieważ pozwala ono klientom modyfikować te podpola. Więc tak, możesz ustawić pola w obiekcie głównym, ale pamiętaj, że pola, które nie powinny być modyfikowane przez klienta, powinny znajdować się w polu bez uprawnień zapisu (lub w innym przypadku jest to ten sam problem).

+0

Jesteś najlepszy! Dziękuję Ci! Zakładam, że nie muszę publikować niczego, co można dodać do tego obiektu profilu? Edycja: Ah, profil jest publikowany automatycznie! Dzięki za tonę! –

+0

Nie ma za co;) –

+0

Dzięki, to też mi się przydało. Tylko jedna uwaga, dostałem błąd, próbując zaktualizować ten sposób i musiałem wskazać, że _id z '{_id: Meteor.userId()}' jak zasugerowano [w tym innym pytaniu] (http://stackoverflow.com/ a/23705715/3961519). – Diego

Powiązane problemy