Node.js Firestore云函数找不到要更新的文档

Node.js Firestore云函数找不到要更新的文档,node.js,firebase-realtime-database,google-cloud-firestore,google-cloud-functions,Node.js,Firebase Realtime Database,Google Cloud Firestore,Google Cloud Functions,我正在尝试创建一个在线状态功能,它使用flatter更新每个用户的在线状态。我通过使用实时数据库、云函数和云Firestore来实现这一点 我的问题是,当我运行我的cloud函数来检测实时数据库中的更改并更新cloud Firestore中用户集合中的状态字段时。它一直说找不到要更新的文档 这是我的云函数代码 const functions = require("firebase-functions"); const admin = require("firebas

我正在尝试创建一个在线状态功能,它使用flatter更新每个用户的在线状态。我通过使用实时数据库、云函数和云Firestore来实现这一点

我的问题是,当我运行我的cloud函数来检测实时数据库中的更改并更新cloud Firestore中用户集合中的状态字段时。它一直说找不到要更新的文档

这是我的云函数代码

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

const firestore = admin.firestore();

exports.onUserStatusChange = functions.database
  .ref("/{uid}/status")
  .onUpdate(async (change, context) => {
    // Get the data written to Realtime Database
    const isOnline = change.after.val();

    // Then use other event data to create a reference to the
    // corresponding Firestore document.
    const userStatusFirestoreRef = firestore.doc(`users/${context.params.uid}`);
    
    console.log(`status: ${isOnline}`);

    return userStatusFirestoreRef.update({
      status: isOnline,
      last_seen: Date.now(),
    });
  });
以下是onUserStatusChange函数的错误

Error: 5 NOT_FOUND: No document to update: projects/posweepay/databases/(default)/documents/users/162057431950849
    at Object.callErrorFromStatus (/workspace/node_modules/@grpc/grpc-js/build/src/call.js:31:26)
    at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client.js:176:52)
    at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:342:141)
    at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:305:181)
    at /workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:124:78
    at processTicksAndRejections (internal/process/task_queues.js:79:11)
实时数据库结构

云Firestore数据库结构


虽然乍一看屏幕截图中的UID是相同的,但错误消息似乎表明存在一些不匹配

要进行故障排除,我建议使用set和merge操作,如果文档不存在,也会创建文档:

return userStatusFirestoreRef.set({
  status: isOnline,
  last_seen: Date.now(),
}, { merge: true });

通过此功能,您可以检查创建了什么新文档,以及它与您希望更新的现有文档的比较情况。

从日志中可以看出,您试图从
用户.accountid
引用文档,而不是使用文档标识符

虽然
accountid
可能是
162057431950849
(我猜这恰好是您实时数据库中文档的UID)-但Firestore中文档的实际标识符是
615862116620550


这似乎是您的数据模型中的一个差异。一种可能的解决方案是将Firestore文档UID存储在实时数据库中,并在需要时使用该值引用Firestore文档。

您可以执行console.log(context.params.UID)吗?我在哪里查看日志?我不认为我可以在我的颤振调试控制台中看到它。在firebase控制台中,您可以看到日志。您似乎试图使用与
accountId
字段值对应的id更新用户,即162057431950849