Câu hỏi của bạn dường như liên quan đến Meteor.userId()
và Meteor.user()
. Phần nội dung câu hỏi dường như hỏi về cái trước trong khi dòng chủ đề hỏi về cái sau. Tôi sẽ cố gắng giải quyết cả hai.
- Trên máy chủ, trong hàm xuất bản, gọi
Meteor.userId()
hoặcMeteor.user()
gây ra lỗi . Thay vào đó, hãy sử dụngthis.userId
hoặcMeteor.users.findOne(this.userId)
, tương ứng. Tuy nhiên, lưu ý rằng chức năng xuất bản chỉ được gọi khi khách hàng đăng ký. Nếu bạn muốn ấn bản thay đổi khi bản ghi người dùng thay đổi, bạn cần phảiobserve()
con trỏ được trả về bởiMeteor.users.find(this.userId)
và thực hiện hành động thích hợp khi hồ sơ thay đổi. -
Trên máy chủ, trong khi một lệnh gọi phương thức đang được xử lý,
Meteor.userId()
vàMeteor.user()
sẽ tương ứng với ID của người dùng đang gọi và bản ghi của họ, tương ứng. Tuy nhiên, hãy lưu ý rằng các lệnh gọi đếnMeteor.user()
sẽ dẫn đến truy vấn DB vì chúng là về cơ bản tương đương vớiMeteor.users.findOne(Meteor.userId())
.Trực tiếp trong cuộc gọi phương thức, bạn cũng có thể sử dụng
this.userId
thay vìMeteor.userId()
, nhưng bạn không chắc sẽ thấy sự khác biệt về hiệu suất đáng kể. Khi máy chủ nhận được lệnh gọi phương thức, nó chạy triển khai phương pháp của bạn với ID của người dùng (và một số thông tin khác) được lưu trữ trong một slot cụ thể trên sợi.Meteor.userId()
chỉ lấy ID từ khe cắm trên sợi quang hiện tại. Điều đó sẽ nhanh chóng.Nói chung, việc cấu trúc lại mã sử dụng
Meteor.userId()
sẽ dễ dàng hơn thanthis.userId
vì bạn không thể sử dụngthis.userId
bên ngoài thân phương thức (ví dụ:this
sẽ không có thuộc tính 'userId' trong một hàm mà bạn gọi từ thân phương thức) và bạn không thể sử dụngthis.userId
trên máy khách. - Trên máy khách,
Meteor.userId()
vàMeteor.user()
sẽ không tạo ra lỗi vàthis.userId
sẽ không làm việc. Cuộc gọi đếnMeteor.user()
về cơ bản tương đương vớiMeteor.users.findOne(Meteor.userId())
, nhưng vì điều này tương ứng với một truy vấn mini-mongo DB, nên hiệu suất có thể không phải là vấn đề đáng lo ngại. Tuy nhiên, vì lý do bảo mật, đối tượng được trả về bởiMeteor.user()
có thể không đầy đủ (đặc biệt nếuautopublish
gói chưa được cài đặt).