2012-11-24 13 views
10

Tôi đang viết một ứng dụng nhạy cảm với dữ liệu trong Meteor và đang cố giới hạn quyền truy cập của khách hàng vào càng nhiều thông tin càng tốt. Do đó, tôi muốn triển khai phía máy chủ một cách để đếm số lượng người dùng đã đăng nhập và ẩn danh.Cách theo dõi số lượng người dùng ẩn danh phía máy chủ trong Meteor?

Tôi đã thử nhiều phương pháp khác nhau. Việc đầu tiên là như được nêu trong câu hỏi này Server cleanup after a client disconnects, mà đề nghị hooking vào:

this.session.socket.on("close") 

Tuy nhiên khi tôi đã làm, và đã cố gắng để thay đổi một bộ sưu tập, nó đã ném một "mã Meteor phải luôn luôn chạy trong một sợi" lỗi. Tôi cho rằng vấn đề này là bởi vì một khi socket bị đóng, Fiber bị giết, và việc truy cập cơ sở dữ liệu là không thể. OP đã chỉ ra giải pháp này có thể là "Meteor code must always run within a Fiber" when calling Collection.insert on server nhưng tôi không chắc đó có phải là phương pháp tốt nhất hay không, dựa trên các nhận xét cho câu trả lời.

sau đó tôi đã cố gắng để tự động chạy trên các biến:

Meteor.default_server.stream_server.all_sockets().length 

nhưng autorun không bao giờ dường như được gọi, vì vậy tôi giả sử biến đó không phải là một bối cảnh phản ứng, và tôi đã không chắc chắn làm thế nào để làm cho nó một.

Ý tưởng cuối cùng là làm một điều phong cách, nhưng điều đó dường như hoàn toàn trái ngược với triết lý Meteor, và tôi nghĩ rằng tôi sẽ chỉ sử dụng như một phương sách cuối cùng tuyệt đối.

Tôi đã thực hiện console.log các chức năng trên this.session.socket và chỉ một chức năng khác có thể là .on("data"), nhưng điều này không được gọi khi đóng socket.

Tôi đang ở đây một chút mất mát ở đây, vì vậy mọi trợ giúp sẽ tuyệt vời, Cảm ơn bạn.

Trả lời

8

Vì mục đích hoàn chỉnh, tốt nhất nên kết hợp hai câu trả lời ở trên. Nói cách khác, làm như sau:

Đây có lẽ là cách kinh điển để thực hiện điều này trong Meteor. Tôi đã tạo gói này như một gói thông minh mà bạn có thể cài đặt với Thiên thạch: https://github.com/mizzao/meteor-user-status

+0

Không thể cảm ơn bạn đủ cho điều này :) – Pawan

+0

Trong khi điều này là rất mát mẻ, các tài liệu đặc biệt nói nó không theo dõi người dùng anon vì vậy nó không thực sự trả lời câu hỏi ban đầu. – cazgp

+1

@cazgp Vì tôi đã viết bài đăng này, tôi đã cập nhật gói để theo dõi người dùng ẩn danh. Rõ ràng là chúng ta không thể theo dõi những người dùng nặc danh trong 'Meteor.users', nhưng tất cả các kết nối của họ đều được theo dõi. –

2

Thanh toán các dự án GitHub howmanypeoplearelooking

Meteor thử nghiệm ứng dụng để hiển thị bao nhiêu người dùng đang trực tuyến ngay bây giờ.

+0

Đó là trò đùa. Tôi đã tải xuống mã ('Dumbs = new Meteor.Collection (" dumbs ");' :)) – Matanya

+0

@Matanya: 'Dumbs' chỉ là một tên bộ sưu tập trẻ con, nhưng [ứng dụng hoạt động] (https: // github .com/murilopolese/howmanypeoplearelooking/pull/2). –

3

Nhờ mẹo của Sorhus, tôi đã giải quyết được vấn đề này. Câu trả lời của anh chứa đựng một nhịp tim, mà tôi muốn tránh. Tuy nhiên, nó chứa đựng mẹo sử dụng "bindEnvironment" của Meteor. Điều này cho phép truy cập vào một bộ sưu tập, nếu không sẽ không thể truy cập được.

Meteor.publish("whatever", function() { 
    userId = this.userId; 
    if(userId) Stats.update({}, {$addToSet: {users: userId}}); 
    else Stats.update({}, {$inc: {users_anon: 1}}); 

    // This is required, because otherwise each time the publish function is called, 
    // the events re-bind and the counts will start becoming ridiculous as the functions 
    // are called multiple times! 
    if(this.session.socket._events.data.length === 1) { 

    this.session.socket.on("data", Meteor.bindEnvironment(function(data) { 
     var method = JSON.parse(data).method; 

     // If a user is logging in, dec anon. Don't need to add user to set, 
     // because when a user logs in, they are re-subscribed to the collection, 
     // so the publish function will be called again. 
     // Similarly, if they logout, they re-subscribe, and so the anon count 
     // will be handled when the publish function is called again - need only 
     // to take out the user ID from the users array. 
     if(method === 'login') 
     Stats.update({}, {$inc: {users_anon: -1}}); 

     // If a user is logging out, remove from set 
     else if(method === 'logout') 
     Stats.update({}, {$pull: {users: userId}}); 

    }, function(e) { 
     console.log(e); 
    })); 

    this.session.socket.on("close", Meteor.bindEnvironment(function() { 
     if(userId === null || userId === undefined) 
     Stats.update({}, {$inc: {users_anon: -1}}); 
     else 
     Stats.update({}, {$pull: {users: userId}}); 
    }, function(e) { 
     console.log("close error", e); 
    })); 
    } 
} 
Các vấn đề liên quan