提问者:小点点

Node.js中云Firestore的自定义对象在snapshot.data中运行,这不是函数错误


我正在开发一个Web应用程序,该应用程序接收来自Node. js服务器的通知。我使用Firebase Cloud FiRecovery作为数据库。两段代码都在同一个js文件中,我已经正确初始化了我的数据库和Firebase管理员(其他操作有效)。我想将从数据库中提取的数据保存在自定义对象中:

// define logentry for user
class LogEntryUser {
  constructor(token, email){
    this.token = token;
    this.email = email;
  }
  getToken(){
    return this.token;
  }
  getEmail(){
    return this.email;
  }
}

// Firebase data converter
logConverterUser = {
  toFirestore: function(logentryuser){
    return {
      token: logentryuser.token,
      email: logentryuser.email
    }
  },
  fromFirestore: function(snapshot, options){
    const data = snapshot.data(options);
    return new LogEntryUser(data.token, data.email)
  }
}

以下是从Cloud FiRecovery读取数据的代码:

db.collection("Users").get().then(function(querySnapshot){
      querySnapshot.forEach((doc) => {
        db.collection("Users").doc(doc.id).withConverter(logConverterUser).get().then(function(snapshot){
          // convert to log object and read token
          logentryuser = snapshot.data();
          var registrationToken = logentryuser.getToken();
        });
      });
    });

运行此脚本会出现错误:

(node:1648) UnhandledPromiseRejectionWarning: TypeError: snapshot.data is not a function at Object.fromFirestore.

我在另一个js项目中使用了相同的代码,一切都很好。我不知道如何解决这个问题。有人能帮我吗?

最美好的祝愿keved


共2个答案

匿名用户

出于某种原因,with Converter方法将实际数据而不是快照传递给fromFiRecovery函数。如下所示从FiRecovery更改为我修复了它。

// Firebase data converter
logConverterUser = {
  toFirestore: function(logentryuser){
    return {
      token: logentryuser.token,
      email: logentryuser.email
    }
  },
  fromFirestore: function(snapshot){
    const data = snapshot;
    return new LogEntryUser(data.token, data.email)
  }

匿名用户

在Node.js服务器中,您可以使用“普通”Javascript对象来存储快照。以下代码解决了我的问题:

db.collection("Users").get().then(function(querySnapshot){
  querySnapshot.forEach((doc) => {
    db.collection("Users").doc(doc.id).get().then(function(snapshot){
      var user = snapshot.data();
      var registrationToken = user.token;
    });
  });
});