在 feathersjs 应用程序之外编辑数据库时如何更新客户端

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

我有两个服务器端应用程序在编辑同一个数据库。

一个服务器是一个 feathersjs 应用程序,另一个是一个简单的 nodejs 应用程序。前端应用程序通过 feathersjs 客户端连接到 feathersjs 应用程序。

如何在nodejs 应用程序编辑数据库时更新连接到feathersjs 应用程序的客户端?由于目前在 featherjs 应用程序之外所做的任何更改都不会反映在 feathersjs 客户端上。

我能否以某种方式触发补丁事件并强制客户端拉下更新的数据?

正如您所指出的,只有通过 Feathers API 所做的更改才会反映出来,但在服务器上您始终可以通过 service.emit:

发出您需要的事件
dbConnection.on('someDatabaseUpdate', data => {
  app.service('messages').emit('patched', data);
  app.service('messages').emit('updated', data);
});

这里要注意的事情(也在this issue中讨论):

  • 不会有用户或任何其他有关方法调用的信息
  • data 不会 运行 通过任何服务挂钩

如果您将 mongodb 与 WiredTiger storageEngine 一起使用,您可以使用 collection.watch() 函数并在您的羽毛应用程序中添加一个监视器,如下所示

   //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
        });
      })
    }

然后我在 /src/services/index.js 中添加了这个简单的监视器(可能不是正确的方法,但它有效)

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

每次更改集合时返回的数据

{ _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 } }

更多信息在这里https://docs.mongodb.com/manual/reference/method/db.collection.watch/