如何使用.onWrite或onchange将Cloud Functions for Firebase的新旧价值进行比较?

Bus*_*pie 5 javascript node.js firebase firebase-realtime-database google-cloud-functions

让我们采取以下数据结构:

数据结构

现在我想用Firebase函数刷新accessTokenFacebook.我测试了两个选项:

  1. onWrite,和:
  2. 调用onChanged

onWrite看起来对我来说是最好的,但具有以下功能:

exports.getFacebookAccessTokenOnchange = functions.database.ref('/users/{uid}/userAccountInfo/lastLogin').onWrite(event => {
  const lastLogin = event.data;
  let dateObject = new Date();
  let currentDate = dateObject.toUTCString();

  return lastLogin.ref.parent.parent.child('services').child('facebook').update({'accessTokenFacebook': currentDate});

});
Run Code Online (Sandbox Code Playgroud)

有事我don'understand /可以解决:当我删除整个userUID记录(用于清理),该userUID记录自动创建,那么只能用以下路径{} UID /服务/ facebood/accesTokenFacebook ...

似乎删除也会触发onWrite.

我也尝试过.onchange,但只有当仍然没有accessTokenFacebook时才触发.当更改成为这个时,更改永远不会再次触发.

所以接下来我要做的是比较旧值和新值.你有一个例子吗?或者有更好的解决方案吗?

Rba*_*bar 11

UPDATE: 云功能最近推出的更改API的说明这里.

现在(> = v1.0.0)

exports.dbWrite = functions.database.ref('/path').onWrite((change, context) => {
  const beforeData = change.before.val(); // data before the write
  const afterData = change.after.val(); // data after the write
});
Run Code Online (Sandbox Code Playgroud)

之前(<= v0.9.1)

exports.dbWrite = functions.database.ref('/path').onWrite((event) => {
  const beforeData = event.data.previous.val(); // data before the write
  const afterData = event.data.val(); // data after the write
});
Run Code Online (Sandbox Code Playgroud)


小智 5

现在这些函数已被弃用,并且这是该主题的第一搜索结果,以下是 Cloud Functions 现在使用的新更新版本。

exports.yourFunction = functions.database.ref('/path/{randomPath}/goes/here').onWrite((change, context) => {
    // Your value after the write
    const newVal = change.after.val();
    // Your value before the write
    const oldVal = change.before.val();
});
Run Code Online (Sandbox Code Playgroud)