2013-10-15 18 views
10

Mục tiêu cuối cùng của tôi là có CUSTOM_FIELD_I_FREAKEN_WANT_TO_PUBLISH có sẵn cho các mẫu qua {{currentUser}} nếu chúng được đăng nhập, nhưng Meteor không gửi tất cả các trường từ bộ sưu tập của người dùng.Trường tùy chỉnh trên Meteor.users không được xuất bản

Trong Server:

Meteor.publish('userdata', function() { 
    this.ready(); // do I really even need to do this? 
    //return Meteor.users.find(); //This STILL doesn't work 
    return Meteor.users.findOne({_id: this.userId}); 
}); 

Trong Chủ đầu tư:

var s = Meteor.subscribe('userdata', function() { 
    console.log('userdata available'); 
    console.log('s.ready: '+s.ready()) 
}); 
console.log('s.ready: '+s.ready()) 

tôi có thể xác minh rằng có những lĩnh vực trong bộ sưu tập bằng cách kết nối với dụ Mongo trực tiếp và gõ: db.users.find():

{ 
    "_id" : "N2M7Zp265vkbTBTFF", 
    "createdAt" : ISODate("2013-10-15T03:29:53.155Z"), 
    "CUSTOM_FIELD_I_FREAKEN_WANT_TO_PUBLISH" : "P4GRrQMixEZducmuo", 
    "profile" : { 
     "name" : "Jonathan Dumaine", 
      ..., 
    }, 
    "services" : { 
     "facebook" : { 
      ...., 
     } 
    } 
} 

Sau khi xác minh rằng đăng ký đã sẵn sàng trong ứng dụng khách, chỉ có f ield trên bộ sưu tập của người dùng là _id_profile. Các trường bổ sung không hiển thị trong ứng dụng khách (thông qua bảng điều khiển Meteor.users.find().fetch()) cũng như không được xác định khi được truy cập thông qua các mẫu.

Đây có phải là lỗi không? Tôi có làm điều gì sai?

Trả lời

22

Xem this answer:

 


Theo mặc định, máy chủ xuất bản tên người dùng, email và hồ sơ

Vì vậy, bạn cần xuất bản/đăng ký cho các trường bổ sung.

Server:

Meteor.publish('userData', function() { 
    if(!this.userId) return null; 
    return Meteor.users.find(this.userId, {fields: { 
    permission: 1, 
    }}); 
}); 

Chủ đầu tư:

Deps.autorun(function(){ 
    Meteor.subscribe('userData'); 
}); 

 


 

Nhìn vào mã của bạn, phần còn thiếu là tự động đăng ký. Không có nó, đăng ký được gọi một lần khi ứng dụng được tải và không thay đổi khi người dùng thay đổi - ví dụ: khi được đặt lần đầu tiên.

+1

Oh đó là một điểm rất tốt, nhưng trong trường hợp này nó vẫn sẽ không hoạt động vì không có gì phản ứng trong chức năng xuất bản, phải không? Nó sẽ phải được chuyển đổi với Meteor.user() thay vì this.userId. Và nếu phản ứng là bên trong chức năng xuất bản, không phải là không cần thiết phải đăng ký bên trong một autorun? : | –

+0

Tôi personnaly sử dụng loại giải pháp (được mô tả trong tài liệu thiên thạch chính thức) và nó hoạt động tốt cho tôi. Nếu bạn cần cập nhật thông tin người dùng từ ứng dụng khách, bạn cần phải thêm Meteor.users.allow/deny – Rebolon

+1

Từ tài liệu "Tuy nhiên, nếu người dùng đã đăng nhập thay đổi, chức năng xuất bản sẽ chạy lại với giá trị mới." Vì vậy, câu trả lời này sẽ hoạt động nhưng một số thông tin không chính xác. Việc xuất bản sẽ chạy lại bất cứ khi nào người dùng thay đổi để khách hàng sẽ nhận được dữ liệu mới. Một dòng xuất bản và một dòng đăng ký sẽ hoạt động tốt. – user728291

8

Từ docs:

Theo mặc định, người dùng hiện hành Tên truy nhập, email và hồ sơ được công bố cho khách hàng.

Vì vậy, để công bố lĩnh vực của bạn, bạn sẽ cần phải làm một cái gì đó như:

Meteor.publish('userdata', function() { 
    return Meteor.users.find({}, {fields: {'CUSTOM_FIELD_I_FREAKEN_WANT_TO_PUBLISH':1}}); 
}); 
+1

Tôi hiểu rằng dòng trong tài liệu là "tên người dùng, email và hồ sơ được xuất bản theo mặc định, vì vậy, bất kỳ' xuất bản' bổ sung nào sẽ xuất bản phần còn lại của các trường ". Tôi figured ''userdata'' sẽ được bổ sung cho mặc định' user' xuất bản kể từ khi nó tham khảo Meteor.users trực tiếp. đây không phải là trường hợp à? –

+1

Ngoài ra, tôi đã thử điều này và nó vẫn không hoạt động. –

+0

Ý của bạn là xóa các tiêu chí tìm kiếm giới hạn việc xuất bản cho dữ liệu của người dùng hiện tại? – user728291

0

Tôi nghĩ, có thể bạn đang cố tìm chức năng Accounts.onCreateUser() từ tài liệu http://docs.meteor.com/#accounts_oncreateuser. Có ví dụ chính xác cách thêm bất kỳ đối tượng nào vào tài liệu người dùng, bên cạnh hồ sơ, email, _id, v.v.

3

Bạn đã rất thân thiết. Bạn có hai vấn đề:

1) Cuộc gọi sẵn sàng() xuất bản là không cần thiết vì nó được gửi tự động nếu bạn trả về con trỏ. Khi bạn cần nó, bạn muốn gọi nó ở phần cuối của xuất bản sau khi tất cả dữ liệu được gửi đi.

2) Bạn muốn trả lại con trỏ được thực hiện với find() thay vì findOne().

Vì vậy, bạn xuất bản sẽ là:

//on server 
Meteor.publish('userData', function(){ 
    return Meteor.users.find({_id: this.userId}); 
}); 

Mã của bạn thể hiện không thực sự kiểm tra nếu có dữ liệu đã được nhận như vậy để đảm bảo rằng không phải là vấn đề thử:

//on client 
var s = Meteor.subscribe('userdata', function() { 
    console.log('userdata available'); 
    console.log('s.ready: '+s.ready()); 
    console.log('userData: ' + JSON.stringify(Meteor.users.findOne())); 
}); 

console.log('s.ready: '+s.ready()) 

Ngoài ra, như David Weldon nói trong câu trả lời của mình, có thể bạn sẽ muốn chỉ định và giới hạn chính xác những trường nào được gửi tới máy khách bằng cách đặt tùy chọn trường trong find() mà bạn xuất bản.

Các vấn đề liên quan