Firebase:获取snapshot.val()对象的子级

时间:2019-01-04 19:07:37

标签: typescript firebase firebase-realtime-database google-cloud-functions

我正在尝试使用Firebase的管理SDK获取第一个匹配子项的对象。到目前为止,我已经能够在父对象中获取一个对象:

{ -LVOBaJXoai9n1mYrs3F: { created: 1546610959716, displayEnterpriseNumber: "BE 0479.312.137", email: "anthony.magnus@gmail.com", enterpriseNumber: "479312137" } }

但我想要

{ created: 1546610959716, email: "john.doe@gmail.com", token: '51234', isActive: true }

代码

在firebase函数中,我有以下代码:

try {
   const token = req.body.token;
   const couponSnapshot = await admin.database().ref(`coupons`).orderByChild('token').equalTo(token).limitToFirst(1).once('value');
   const coupon = couponSnapshot.val();

   console.log(coupon) //{-LVOBaJXoai9n1mYrs3F: {…}} Object in Object...

} catch(error) {
   //error handling
}

如何从父对象获取子对象?

我试图循环遍历couponSnapshot并将子值附加到coupon变量,但出现错误。

const couponSnapshot = await admin.database().ref(`coupons`).orderByChild('token').equalTo(token).limitToFirst(1).once('value');

let coupon = {};

couponSnapshot.forEach(childSnapshot => {
  coupon = childSnapshot.val();
});

console.log(coupon.email);

错误:

error TS2345: Argument of type '(childSnapshot: DataSnapshot) => void' is not assignable to parameter of type '(
a: DataSnapshot) => boolean'.
  Type 'void' is not assignable to type 'boolean'.

Property 'email' does not exist on type '{}'.

有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

您已经告诉TypeScript,您希望强类型键入coupon为一个空对象,并且只能是一个空对象。您稍后将告诉它访问对象email上的属性,该属性在空对象中不存在。这就是为什么您要提出错误:Property 'email' does not exist on type '{}'.

您根本不应提供任何键入提示。如果您希望let email;的类型为any,则只需简单地设置@Override public Collection<Sale> selectSales(String map) { HashSet<Sale> sales = new HashSet(); for (Sale sale : salesList) { if (sale.getMap().equals(map)) { sales.add(sale); } } return sales; } ,它可以访问对象上的任意属性。当然,您可能还需要先检查是否已定义它,因为这同样会出错。