我需要检测我的云函数中何时只有某个字段发生了变化

I need to detect when only a certain field has changed in my cloud function

在下面查看我的云功能。我想在 Job/{jobId} 中的状态字段发生变化时做一些事情,然后在 Job/{jobId} 中的任何其他字段发生变化时做一些其他事情,所以我在下面创建了两个函数。但似乎当状态字段发生变化时,这两个函数都会触发。我该如何限制这种行为。

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

//-----
const db = functions.database;
const adminDb = admin.database();
//-----


//JOBS
exports.onJob = db
    .ref("/Jobs/{jobId}")
    .onWrite((event) => {

        //...my codes

    });



exports.onJobStatus = db
    .ref("/Jobs/{jobId}/status")
    .onWrite((event) => {

   //...my codes

    });

status 节点的所有更改,都算作jobid 节点的更改。因此,您可以为您感兴趣的每个 child 创建监听器,而不是监听 parent(jobid)。 或者,您可以在 jobid 侦听器中添加一个条件,以忽略源自状态节点的事件。

您可以将节点的先前状态 (event.data.previous) 与当前状态 (event.data) 进行比较。

所以你可以检查是否只有状态字段发生了变化,然后触发一些代码。

例如,假设您的节点中还有 "name" 和 "jobDate" 字段。 函数开头的条件语句可能如下所示:

let statusHasChanged = false;
let otherFieldsHaveChanged = false;

if (event.data.previous.val().status !== event.data.val().status) {
  //status has changed
  statusHasChanged = true;
}

//check other fields
  if ((event.data.previous.val().name !== event.data.val().name) 
   || (event.data.previous.val().jobDate !== event.data.val().jobDate) {
  //at least one other field has changed
  otherFieldsHaveChanged = true;
}

//now I know exactly what has changed and what to do next !!!

然后您可以将结果用于 运行 您想要的代码。

您还可以使用 .changed() 函数来检查字段是否已更改(如果您不需要知道更改的内容),请参阅 docs

上面带有 changed() 函数的示例可能如下所示:

let eventSnapshot = event.data;
let statusSnapshot = eventSnapshot.child('status');
let nameSnapshot = eventSnapshot.child('name');
let jobDateSnapshot = eventSnapshot.child('jobName');

let statusHasChanged = false;
let otherFieldsHaveChanged = false;

if (statusSnapshot.changed()) {
  //status has changed
  statusHasChanged = true;
}

//check other fields
  if (nameSnapshot.changed() || jobDateSnapshot.changed())  {
  //at least one other field has changed
  otherFieldsHaveChanged = true;
}

发布作为答案,因为我以后可能会再次查找它。

截至 2021 年的正确语法是使用 snap.before:

const functions = require('firebase-functions');

functions.firestore.document('foo/{id}').onChange((snap, context)) => {
  if(snap.before.data().status !== snap.after.data().status){
    // ...
  }
}