Stempel Waktu Firestore dikonversi ke peta saat diproses melalui fungsi cloud

Saya mengalami masalah dengan kelas firebase.firestore.Timestamp.

Saya sedang mengerjakan aplikasi Angular 6 dengan firestore. Saya telah menggunakan Stempel Waktu tanpa masalah selama beberapa waktu, namun saya sedang dalam proses memindahkan beberapa layanan sisi klien saya ke fungsi cloud.

Masalahnya adalah ini:

Ketika saya melakukan operasi tulis langsung dari sisi klien, seperti ini:

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

Dokumen tersebut ditulis dengan benar ke firestore sebagai Stempel Waktu.

Namun, saat saya mengirim dokumen ke fungsi cloud, lalu melakukan penulisan dari fungsi tersebut, dokumen tersebut akan ditulis sebagai peta, bukan stempel waktu. Demikian pula, jika saya menggunakan objek JS Date() alih-alih firestore.Timestamp, objek tersebut akan ditulis dengan benar dari sisi klien tetapi ditulis sebagai string dari fungsi cloud.

Ini masuk akal mengingat dokumennya hanya JSON di request.body, saya rasa saya hanya berharap firestore akan cukup pintar untuk menangani konversi secara implisit.

Untuk saat ini, saya memiliki solusi yang hanya secara manual mengubah objek menjadi firestore. Stempel waktu lagi di fungsi cloud, tapi saya berharap ada solusi yang lebih efektif, mungkin sesuatu yang terkubur di SDK yang belum dapat saya temukan.

Adakah orang lain yang menemukan dan, idealnya, menemukan solusi untuk ini?

Saya dapat memberikan lebih banyak contoh kode jika diperlukan.


person Alec Daling    schedule 18.11.2018    source sumber


Jawaban (2)


Perilaku yang Anda amati memang diharapkan. Pustaka klien Firestore memiliki interpretasi khusus terhadap objek jenis Stempel Waktu, dan objek tersebut dikonversi ke bidang jenis Stempel Waktu di database saat ditulis. Namun, jika Anda mencoba membuat serial objek Stempel Waktu sebagai JSON, Anda hanya akan mendapatkan objek dengan komponen stempel waktu milidetik dan nanodetik. Jika Anda ingin mengirim komponen stempel waktu ini ke Cloud Functions atau perangkat lunak lainnya, tidak masalah, tetapi perangkat lunak lain tersebut harus menyusun kembali objek Stempel Waktu asli dari bagian tersebut sebelum menulis ke Firestore dengan Admin SDK atau apa pun SDK yang Anda gunakan untuk menangani Firestore.

person Doug Stevenson    schedule 18.11.2018
comment
Terima kasih, hanya itu yang perlu saya dengar. Solusi saya sepertinya berfungsi dengan baik, hanya saja rasanya kurang bersih. - person Alec Daling; 18.11.2018

di model kelas Anda, gunakan

@ServerTimestamp var timestamp: Date? = null

or

@ServerTimestamp Date timestamp = null

Anda dapat mengabaikan inisialisasi stempel waktu dari kode Anda, misalnya Tanggal baru()

Contoh:

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

or

public class ProductItem() {
    String userId;
    Double avgRating;
    @ServerTimestamp Date timestamp;
}
person Joseph Wambura    schedule 18.11.2018
comment
Jujur saja, saya tidak mengerti apa yang disarankan di sini. Saya tidak yakin apakah ini relevan tetapi saya ingin model sisi klien saya konsisten dengan pengetikan yang dikembalikan dari kueri firestore. Karena itu, atribut tanggal sisi klien saya diketikkan ke stempel waktu, bukan tanggal karena saya mengharapkan stempel waktu dikembalikan oleh kueri. Saya belum menemukan anotasi @ServerTimestamp, dapatkah Anda mengarahkan saya ke dokumentasi apa pun? Juga, mungkin tidak relevan, tetapi saya mencoba memasukkan tanggal yang belum tentu merupakan waktu server saat ini. - person Alec Daling; 18.11.2018