Trong trường hợp này, phần lớn là do sự hiểu nhầm về mô hình dữ liệu của Meteor.
Mặc dù có thể gửi dữ liệu bằng lệnh gọi phương thức, nhưng thông thường bạn sẽ muốn sử dụng các ấn phẩm và đăng ký
để gửi dữ liệu đến máy khách. Những điều này có thuộc tính gần như kỳ diệu mà các truy vấn trực tiếp - nghĩa là, bất kỳ cập nhật nào cho truy vấn sẽ được gửi đến máy khách tự động. Mã hiện tại bạn có, nếu nó hoạt động bình thường, sẽ không có dữ liệu trực tiếp. Vấn đề cụ thể là Meteor.call
là không đồng bộ, vì vậy người trợ giúp tin nhắn của bạn sẽ không nhìn thấy bất cứ điều gì.
Thay vào đó, đây là những gì bạn muốn làm. Trên máy chủ, bạn sẽ thiết lập một ấn phẩm của bộ sưu tập tin nhắn:
Meteor.publish("someWeirdName", function() {
return Messages.find({},{ sort: { timestamp:-1}, limit: 20});
});
Lưu ý sự khác biệt so với mã của bạn:không có fetch()
, bởi vì chúng tôi muốn có một con trỏ trực tiếp và 20
có thể là những gì bạn dự định như một tùy chọn giới hạn. Lưu ý rằng tôi cũng gọi đây là someWeirdName
vì đó là tên của ấn phẩm chứ không phải bộ sưu tập mà bạn sẽ sử dụng để đăng ký trên máy khách. Để được giải thích chi tiết hơn, bạn có thể muốn xem bài đăng này
.
Sau đó, trên máy khách, bạn chỉ cần những thứ sau:
Meteor.subscribe("someWeirdName");
Template.messages.helpers({
showMessages: function(){
return Messages.find();
}
});
Lưu ý rằng cuộc gọi Meteor.subscribe("Messages")
trước đó của bạn không làm gì cả, vì không có ấn phẩm nào có tên Messages
. Ngoài ra, chúng tôi sẽ sử dụng bộ đệm ẩn thông báo phía máy khách để tạo con trỏ hiển thị thông báo.
Ngoài ra, tất cả mã này yêu cầu bạn phải khai báo những điều sau trên cả máy chủ và máy khách:
Messages = new Mongo.Collection("callMeWhateverYouWant");
Cũng lưu ý rằng đối số được sử dụng để khởi tạo bộ sưu tập này không liên quan gì đến cách bạn tham chiếu đến bộ sưu tập trong mã của mình, trừ khi bạn đang viết xuất bản tùy chỉnh . Nó chỉ đơn giản là xác định bộ sưu tập trong cơ sở dữ liệu cơ bản.