从函数的结果中提取TImestamp

时间:2019-10-09 19:48:38

标签: javascript typescript firebase google-cloud-firestore google-cloud-functions

所以我有一个像这样的界面:

interface Test {
    // ...
    created_at: Timestamp;
    // ...
}

然后从类似这样的函数中返回一个对象:

export const getTest = functions.https.onCall(async (data, context) => {
    if (!context.auth) {
        return null;
    }

    let snap = await admin
                 .firestore()
                 .collection('test')
                 .get();

    return snap.docs.map(r => ({ // Add id to the output
        id: r.id,
        ...r.data()
    })[0];
});

所以我应该在我的应用程序中获取时间戳记对象,但这是我尝试从如下功能中获取对象时在chrome控制台中获取的内容:

// Using AngularFireFunctions
let result: Test = await this.fns.httpsCallable<void, Test>('getTest')().toPromise();

这是result.created_at的全部内容:

enter image description here

致电result.created_at.toDate()时遇到....created_at.toDate is not a function错误。

该如何更改?

这就是我现在所坚持的:

result.created_at = new Date(result.created_at._seconds * 1000);

1 个答案:

答案 0 :(得分:2)

您似乎希望可调用函数保留从其返回的对象的数据类型。这不是很有效。该函数会将传递的对象序列化为JSON,丢失所有对象类型信息,包括Timestamp类型。时间戳正在使用其内部表示进行序列化,这就是您在日志输出中看到的内容。我不会编写依赖于此的代码,因为显然使用了隐藏的实现细节。

您可能应该做的是将Timestamp转换为普通的JavaScript对象,并在返回的结果中使用它。然后,在客户端,您将需要编写代码,以了解如何选择代表该时间戳记。这是额外的工作,但是它使客户端无法了解那些私有实现细节。

我建议将Timestamp的秒和纳秒部分放入一个普通的旧对象中,替换现有的Timestamp字段,然后使用Timestamp constructor将该对象转换回客户端上的Timestamp,该操作需要几秒和纳秒的时间组件作为参数。