tivoni
tivoni

Reputation: 2020

Meteor.subscribe on server side

I want to create a backend service which monitors a mongodb collection for new entries. As those are being created, I wish to run processing and update them. I thought doing so with a Meteor service/app would be a wise idea because Meteor uses 'oplog tailing' which seems ideal for this purpose (I'd rather avoid polling if possible).

As such, I figured creating a minimal server-side-only app should solve it. So basically, I need something along these lines:

if (Meteor.isServer) {
    MyCollection = new Mongo.Collection('myCollection');
    Meteor.publish('myCollectionPub', function () {
         return MyCollection.find({ some: criteria... });
    }
    // is there such a thing?
    Meteor.serverSideSubscribe('MyCollectionPub', 
        function (newDocs) {
            // process/update newDocs
    });
}

According to the Meteor docs, I cannot use Meteor.subscribe() on the server (and indeed it crashes if I try).

Question is: Are there ways of 'subscribing' to collection updates on the server?

Upvotes: 2

Views: 1494

Answers (2)

Brett McLain
Brett McLain

Reputation: 2010

An alternative to @tarmes suggestion is the collection-hooks package, however as pointed out by David Weldon, it will only trigger in instance it is run in:

https://github.com/matb33/meteor-collection-hooks

MyCollection.after.insert(function (userId, doc) {
    // ...
});

If you need it to run even when another instance makes a change in the mongo database, you can observe a cursor that is returned from your collection:

MyCollection.find({created_at : {$gt: some_current_time}}).observe({
    added: function(item) {
        // Alert code
    }
});

Upvotes: 2

tarmes
tarmes

Reputation: 15442

The PeerLibrary server-autorun package (along with it's dependant, reactive-mongo) will provide you with easy server-side observation of collections.

Upvotes: 2

Related Questions