Pertanyaan Anda tampaknya menggabungkan Meteor.userId() dan Meteor.user() . Tubuh pertanyaan tampaknya menanyakan tentang yang pertama sementara baris subjek menanyakan tentang yang terakhir. Saya akan mencoba membahas keduanya.
- Di server, dalam fungsi publikasikan, memanggil
Meteor.userId()atauMeteor.user()akan menyebabkan kesalahan . Sebagai gantinya, gunakanthis.userIdatauMeteor.users.findOne(this.userId), masing-masing. Namun, perhatikan bahwa fungsi publikasikan hanya dipanggil saat klien berlangganan. Jika Anda ingin publikasi berubah saat catatan pengguna berubah, Anda harusobserve()kursor dikembalikan olehMeteor.users.find(this.userId)dan mengambil tindakan yang tepat saat catatan berubah. -
Di server, saat pemanggilan metode sedang diproses,
Meteor.userId()danMeteor.user()akan sesuai dengan ID pengguna panggilan dan catatan mereka, masing-masing. Namun, perlu diketahui bahwa panggilan keMeteor.user()akan menghasilkan kueri DB karena dasarnya setara denganMeteor.users.findOne(Meteor.userId()).Langsung dalam pemanggilan metode, Anda juga dapat menggunakan
this.userIdbukannyaMeteor.userId(), tetapi Anda tidak akan melihat perbedaan performa yang signifikan. Saat server menerima panggilan metode, itu menjalankan implementasi metode Anda dengan ID pengguna (dan beberapa info lainnya) disimpan di slot tertentu pada serat.Meteor.userId()hanya mengambil ID dari slot pada serat saat ini. Itu harus cepat.Biasanya lebih mudah untuk memfaktorkan ulang kode yang menggunakan
Meteor.userId()darithis.userIdkarena Anda tidak dapat menggunakanthis.userIddi luar badan metode (mis.thistidak akan memiliki properti 'userId' dalam fungsi yang Anda panggil dari badan metode) dan Anda tidak dapat menggunakanthis.userIdpada klien. - Pada klien,
Meteor.userId()danMeteor.user()tidak akan menimbulkan kesalahan danthis.userIdtidak akan berfungsi. Panggilan keMeteor.user()adalah pada dasarnya setara denganMeteor.users.findOne(Meteor.userId()), tetapi karena ini sesuai dengan kueri DB mini-mongo, kinerja mungkin tidak akan menjadi masalah. Namun, untuk alasan keamanan, objek yang dikembalikan olehMeteor.user()mungkin tidak lengkap (terutama jikaautopublishpaket tidak diinstal).