我正在开发一个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
出于某种原因,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;
});
});
});