从快照获取时间戳字段,作为Cloud Function触发器内的时间戳

时间:2019-02-04 17:36:25

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

在打字稿中,我可以通过在Cloud Functions Triggers中使用change.after.updateTimesnap.createTime来创建带有诸如createdAt,updatedAt作为时间戳的字段的文档。

但是在诸如onUpdate之类的其他触发器中,假设要存储时间戳的字段change.after.data().updatedAt给了我一个对象。

如果无法获取它们作为时间戳值,我该如何比较它们?我如何获得该字段作为时间戳值?谢谢

admin.initializeApp();
const firestore = admin.firestore();
const settings = { timestampsInSnapshots: true };
firestore.settings(settings);


export const setCreatedAt = functions.firestore.document('path')
    .onCreate(async (snap, context) => {

        return snap.ref.update({
            createdAt: snap.createTime, // Type Timestamp
            updatedAt: snap.createTime // Type Timestamp
        });

    });

export const setUpdatedAt = functions.firestore.document('path')
    .onUpdate(async (change, context) => {

        let beforeTimestamp = change.before.data().updatedAt; // Type object, not Timestamp
        let afterTimestamp = change.after.data().updatedAt; // Type object, not Timestamp

        console.log('beforeTimestamp', beforeTimestamp);
        console.log('afterTimestamp', afterTimestamp);

        if (change.before.data().updatedAt === change.after.data().updatedAt) {
            change.after.ref.update({
                updatedAt: change.after.updateTime, // Type Timestamp
            });
        }
    });

下图显示了进行更新时的日志。 Example

似乎{ timestampsInSnapshots: true }设置无效,因为控制台内仍然有警告。但是为什么呢?

  

Firestore中存储的Date对象的行为将改变   而且您的应用可能会崩溃

1 个答案:

答案 0 :(得分:0)

您需要将返回的Timestamp对象转换为Date对象:

beforeTimestamp.toDate()

然后,您可以将Date对象与< and >运算符进行比较。如果需要比较相等性,则需要先将日期转换为数字:beforeTimestamp.toDate().getTime()