【问题标题】:Read a specific node once from a Firebase Database using NativeScript使用 NativeScript 从 Firebase 数据库中读取特定节点一次
【发布时间】:2018-03-17 17:37:31
【问题描述】:
如何使用 Eddy Verbruggen 的 nativescript-plugin-firebase 插件读取 Firebase 数据库中节点的值?
我想读取路径的内容:
/players/{player_id}
是否有类似于 FIRDatabaseRef.observeSingleEvent()(在 iOS SDK 中)或 firebase.database().once()(在 js SDK 中)的东西?
在 nativescript-plugin-firebase 插件中,我尝试使用 firebase.addValueEventListener(),但是它接收一个回调作为参数,我真的很想要一个返回带有读取值的 Promise 的方法。此外,我还需要在执行读取后手动删除观察者。
使用 firebase.query() 似乎也不太正确,因为我需要设置过滤器、范围和查询来读取特定路径中的单个值。肯定有更好的办法!
谢谢!
【问题讨论】:
标签:
typescript
firebase
firebase-realtime-database
nativescript
angular2-nativescript
【解决方案1】:
我最终将 firebase.query() 与 singleEvent = true 一起使用。为此,我创建了一个名为 once() 的函数:
once(path, key) {
return firebase.query(
()=>{},
path,
{
singleEvent: true,
orderBy: {
type: firebase.QueryOrderByType.KEY
},
ranges: [{
type: firebase.QueryRangeType.EQUAL_TO,
value: key
}],
limit: {
type: firebase.QueryLimitType.FIRST,
value: 1
}
})
.then(
queryResult => {
// A query result contains a dictionary containing all objects that matched the query criteria. As we are interested on obtaining a single object, we can assume that dictionary will have only a single element.
//
let queryValue = queryResult.value;
let keys = Object.keys(queryValue);
if (keys.length > 0) {
let key = keys[0]
let value = queryValue[key];
return Promise.resolve(value);
} else {
return Promise.resolve(null);
}
}
)
}
可以这样使用:
once("/players", userId).then(userData => {console.log(userData)})
我不确定我是否非常喜欢这种方法。似乎使用查询来访问特定节点可能是无效的。我仍在寻找更好的解决方案。谢谢。