Search code examples
javascriptfeathersjs

How to update clients when database is edited outside of feathersjs app


I have two server-side applications editing the same database.

One server is a feathersjs app and another is a simple nodejs app. A frontend app connects to the feathersjs app via feathersjs client.

How, when the nodejs app edits the database, can I update clients connected to the feathersjs app? As currently any changes made outside the featherjs app aren't reflected on the feathersjs clients.

Can I trigger the patched event somehow and force the clients to pull down the updated data?


Solution

  • if you are using mongodb with WiredTiger storageEngine you can use the collection.watch() function and add a monitor in your feathers app something like this

       //src/services/monitor.js 
       module.exports = function(app){
          //get mongo client
          const mongoClient = app.get('mongoClient');
          //connect db
          mongoClient.then(db => {
    
            //collection to watch
            const collection = db.collection('your_collection_name')
    
            //watch collection
            const changeStream = collection.watch({ fullDocument: 'updateLookup' });
    
            //on some data changed
            changeStream.on('change', data => {
              console.log ( 'something is changed in your collection' , data )
              //your service.emit
            });
          })
        }
    

    Then I added this simple monitor in the /src/services/index.js (maybe not the right way but it works)

    //src/services/index.js
    ...
    const monitor = require('./monitor.js');
    module.exports = function (app) {
       ...
       app.configure(monitor);
       ...
    }; 
    

    Data returned on every change on the collection

    { _id:
       { _data:
          '825C7F03230000001C29295A100490DEF2C65812410FABF0DE46F9C89D7246645F696400645C1AC097B189CBD5D4A24D330004' },
      operationType: 'replace',
      clusterTime:
       Timestamp { _bsontype: 'Timestamp', low_: 28, high_: 1551827747 },
      fullDocument:
       { _id: 5c1ac097b189cbd5d4a24d33,
         id: '12',
         language: 'it-IT',
         category: 'some data',
         slug: '',
         description: 'some data',
         src:'',
         color: 'card',
         status: true,
         home: true,
         order_int: '3',
         visual: 'card' },
      ns: { db: 'mydb', coll: 'mycollection' },
      documentKey: { _id: 5c1ac097b189cbd5d4a24d33 } }
    

    More info here https://docs.mongodb.com/manual/reference/method/db.collection.watch/