在下面查看我的云功能。我想在 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
});
最佳答案
您可以将节点的先前状态 (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;
}
关于javascript - 我需要检测我的云函数中何时只有某个字段发生了变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44853515/