Twoje pytanie wydaje się łączyć Meteor.userId() i Meteor.user() . Treść pytania wydaje się pytać o to pierwsze, podczas gdy w temacie pytania o to drugie. Postaram się zająć obiema kwestiami.
- Na serwerze, w ramach funkcji publikowania, wywołując metodę
Meteor.userId()lubMeteor.user()czy spowoduje błąd . Zamiast tego użyjthis.userIdlubMeteor.users.findOne(this.userId), odpowiednio. Należy jednak pamiętać, że funkcja publikowania jest wywoływana tylko wtedy, gdy klient subskrybuje. Jeśli chcesz, aby publikacja zmieniała się po zmianie rekordu użytkownika, musisz wykonaćobserve()kursor zwrócony przezMeteor.users.find(this.userId)i podejmij odpowiednie działania, gdy rekord się zmieni. -
Na serwerze, podczas przetwarzania wywołania metody,
Meteor.userId()iMeteor.user()będzie odpowiadać odpowiednio identyfikatorowi dzwoniącego użytkownika i jego zapisowi. Należy jednak pamiętać, że wywołaniaMeteor.user()spowoduje zapytanie do bazy danych, ponieważ są one zasadniczo odpowiednikMeteor.users.findOne(Meteor.userId()).Bezpośrednio w wywołaniu metody możesz również użyć
this.userIdzamiastMeteor.userId(), ale jest mało prawdopodobne, że zobaczysz znaczącą różnicę w wydajności. Gdy serwer otrzyma wywołanie metody, uruchamia implementację metody z identyfikatorem użytkownika (i kilkoma innymi informacjami) przechowywane w konkretnym s na włóknie.Meteor.userId()po prostu pobiera identyfikator z gniazda na bieżącym włóknie. To powinno być szybkie.Generalnie łatwiej jest zrefaktoryzować kod, który używa
Meteor.userId()niżthis.userIdponieważ nie możesz użyćthis.userIdpoza treścią metody (np.thisnie będzie miała właściwości „userId” w funkcji, którą wywołujesz z treści metody) i nie możesz użyćthis.userIdna kliencie. - Na kliencie
Meteor.userId()iMeteor.user()nie zwróci błędów ithis.userIdnie będzie działać. WywołujeMeteor.user()są zasadniczo równoważneMeteor.users.findOne(Meteor.userId()), ale ponieważ odpowiada to zapytaniu mini-mongo DB, wydajność prawdopodobnie nie będzie problemem. Jednak ze względów bezpieczeństwa obiekt zwrócony przezMeteor.user()może być niekompletna (zwłaszcza jeśliautopublishpakiet nie jest zainstalowany).