【问题标题】:Firebase: Get child of snapshot.val() objectFirebase:获取 snapshot.val() 对象的子对象
【发布时间】:2019-05-31 08:45:01
【问题描述】:

我正在尝试使用 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 '{}'.

有人可以帮帮我吗?

【问题讨论】:

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


    【解决方案1】:

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

    您根本不应该提供任何打字提示。只需let email;,如果您希望它是any 类型,则无需默认分配,这样您就可以访问对象上的任意属性。当然,您可能还需要在进入它之前检查它是否已定义,因为这也是一个错误。

    【讨论】:

    • 您可能想澄清您在哪里看到了其他错误,因为我复制并粘贴了您的代码并且无法重现其他任何内容。
    • 嗯,我通过在 forEach 循环中添加 return true; 解决了第一个错误 Argument of type '(childSnapshot: DataSnapshot) => void' is not assignable to parameter of type '( a: DataSnapshot) => boolean'. Type 'void' is not assignable to type 'boolean'.
    • 好的,这是因为传递给 forEach 的函数预计会返回 true 或 false,具体取决于您是否要继续到列表中的下一个子项。
    猜你喜欢
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2018-08-11
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    相关资源
    最近更新 更多