通过云功能处理时,Firestore时间戳会转换为地图

时间:2018-11-18 18:07:06

标签: firebase google-cloud-firestore

firebase.firestore.Timestamp类出现问题。

我正在使用Firestore开发Angular 6应用。我已经使用Timestamps一段时间了,但没有任何问题,但是我正在将一些客户端服务移至云功能。

问题是这样的:

当我直接从客户端执行写操作时,例如:

const doc = { startTimestamp: firebase.firestore.Timestamp.fromDate(new Date()) };
firebase.firestore().doc('some_collection/uid).set(doc);

将文档正确地写入时间戳作为时间戳。

但是,当我将文档发送到云函数,然后从该函数执行写操作时,它会以地图而非时间戳的形式写入。同样,如果我使用JS Date()对象而不是firestore.Timestamp,它会从客户端正确写入,但会从云函数以字符串形式写入。

鉴于文档仅是request.body中的JSON,这很有意义,我想我只是希望firestore足够聪明以隐式处理转换。

就目前而言,我有一个解决方法,只是将对象手动转换为firestore.Timestamps,再次在云函数中使用,但我希望有一个更有效的解决方案,可能是我无法将其隐藏在SDK中找到。

有没有其他人遇到过,并且理想地找到了解决方案?

如果需要,我可以提供更多代码示例。

2 个答案:

答案 0 :(得分:1)

您正在观察的行为是预期的。 Firestore客户端库对时间戳类型对象有特殊的解释,并且在编写时会将它们转换为数据库中的时间戳类型字段。但是,如果尝试将Timestamp对象序列化为JSON,则只会得到带有时间戳的毫秒和纳秒分量的对象。如果您想将这些时间戳组件发送到Cloud Functions或其他软件,那很好,但是在使用Admin SDK或其他工具写入Firestore之前,该另一软件必须从这些部分中重构一个真正的Timestamp对象。用于处理Firestore的SDK。

答案 1 :(得分:0)

在您的班级模型中,使用

@ServerTimestamp var timestamp: Date? = null

@ServerTimestamp Date timestamp = null

您可以从代码中省去初始化时间戳,比如说新的Date()

示例:

@IgnoreExtraProperties
data class ProductItem(
    var userId: String? = "",
    var avgRating: Double = 0.toDouble(),
    @ServerTimestamp var timestamp: Date? = null
)

public class ProductItem() {
    String userId;
    Double avgRating;
    @ServerTimestamp Date timestamp;
}