2013-09-22 27 views
5

Được rồi, vì vậy tôi hơi bối rối về điều gì đó với Meteor.js. Tôi đã tạo một trang web với nó để kiểm tra các khái niệm khác nhau và nó hoạt động tốt. Khi tôi đã xóa "không an toàn" và "tự động xuất bản", tôi nhận được nhiều lỗi "truy cập bị từ chối" khi cố gắng truy xuất và đẩy tới máy chủ. I belive nó có cái gì để làm với đoạn mã sau:Xuất bản và Đăng ký Meteor.js?

Template.posts.posts = function() { 
    return Posts.find({}, {sort: {time: -1}}); 
} 

Tôi nghĩ rằng nó đang cố gắng truy cập vào bộ sưu tập trực tiếp, mà nó được phép làm với "không an toàn" và "autopublish" được kích hoạt, nhưng một khi họ đã bị vô hiệu hóa nó đã được cấp quyền truy cập bị từ chối. Một phần khác mà tôi nghĩ là có vấn đề:

else { 
    Posts.insert({ 
    user: Meteor.user().profile.name, 
    post: post.value, 
    time: Date.now(), 
}); 

Tôi nghĩ rằng cùng một điều đang xảy ra: nó đang cố gắng truy cập trực tiếp vào bộ sưu tập mà nó không được phép làm.

Câu hỏi của tôi là, làm cách nào để xác định lại nó để tôi không cần "không an toàn" và "tự động xuất bản" được bật?

Cảm ơn.

EDIT

cuối cùng:

/** 
* Models 
*/ 
Posts = new Meteor.Collection('posts'); 

posts = Posts 

if (Meteor.isClient) { 

    Meteor.subscribe('posts'); 


} 

if (Meteor.isServer) { 

    Meteor.publish('posts', function() { 
     return posts.find({}, {time:-1, limit: 100}); 
    }); 


    posts.allow({ 

     insert: function (document) { 
      return true; 
     }, 
     update: function() { 
      return false; 
     }, 
     remove: function() { 
      return false; 
     } 

    }); 

} 
+0

có, bạn khai báo biến 'Bài đăng' nhưng cố gắng truy cập nó bằng 'bài đăng' trên máy chủ. Bạn nên sửa lỗi đánh máy ngay bây giờ bạn có câu hỏi và câu trả lời hiển thị mã sẽ không chạy. – user728291

Trả lời

7

Ok, vì vậy có hai phần cho câu hỏi này:

Autopublish

Để công bố cơ sở dữ liệu trong thiên thạch, bạn cần có mã trên cả phía máy chủ và phía máy khách của dự án. Giả sử bạn đã khởi tạo bộ sưu tập (Posts = new Meteor.Collection('posts')), sau đó bạn cần

if (Meteor.isServer) { 
    Meteor.publish('posts', function(subsargs) { 
     //subsargs are args passed in the next section 
     return posts.find() 
     //or 
     return posts.find({}, {time:-1, limit: 5}) //etc 
    }) 
} 

Sau đó cho khách hàng

if (Meteor.isClient) { 
    Meteor.subscribe('posts', subsargs) //here is where you can pass arguments 
} 

không an toàn

Mục đích của không an toàn là cho phép khách hàng để bừa bãi thêm , sửa đổi và loại bỏ bất kỳ mục cơ sở dữ liệu nào nó muốn. Tuy nhiên, hầu hết thời gian bạn không muốn điều đó. Một khi bạn loại bỏ không an toàn, bạn cần phải thiết lập các quy tắc trên máy chủ chi tiết những người có thể làm những gì. Hai hàm này là db.allow và db.deny. Ví dụ.

if (Meteor.isServer) { 
    posts.allow({ 
     insert:function(userId, document) { 
      if (userId === "ABCDEFGHIJKLMNOP") { //e.g check if admin 
       return true; 
      } 
      return false; 
     }, 
     update: function(userId,doc,fieldNames,modifier) { 
      if (fieldNames.length === 1 && fieldNames[0] === "post") { //they are only updating the post 
       return true; 
      } 
      return false; 
     }, 
     remove: function(userId, doc) { 
      if (doc.user === userId) { //if the creator is trying to remove it 
       return true; 
      } 
      return false; 
     } 
    }); 
} 

Tương tự như vậy, db.deny sẽ cư xử một cách chính xác như nhau, ngoại trừ một phản ứng của true sẽ có nghĩa là "không cho phép hành động này"

Hy vọng điều này trả lời tất cả các câu hỏi của bạn

+0

Khi bạn nói hàm 'insert: function (userId, document)' hoặc 'update: (userId, doc, fieldNames, modifier)', làm thế nào để bạn vượt qua các đối số đó? Và, bạn có làm như vậy từ khách hàng hoặc máy chủ? –

+1

Bạn không gọi những chức năng này mỗi lần. Chúng được gọi bởi thiên thạch trên các sự kiện nhất định, và thông qua những đối số của người gọi. Điều này có nghĩa không? – Zwade

+0

Mmkay, vì vậy chúng được gọi bởi một số sự kiện ... nhưng tôi không chắc tôi hiểu cách các đối số được thông qua.Bạn có thể cung cấp (hoặc liên kết tới) một ví dụ trong đó một đoạn mã khách hàng kích hoạt các chức năng chèn/cập nhật/xóa và các đối số được truyền không? –

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