Я пишу код Node.js для импорта данных из существующей базы данных в Firebase Cloud Firestore. Мы создали даты createdAt и updatedAt, которые я хочу сохранить в переходе. Проблема в том, что мы создали облачные функции, чтобы автоматически устанавливать их при создании объекта, поэтому он всегда перезаписывает значение объекта текущей меткой времени. Если я снова запустил наш скрипт импорта, таким образом, set обновляет существующий документ, значения createdAt и updatedAt в объекте сохраняются.
Как я могу заставить его использовать указанные значения и не перезаписывать их текущей меткой времени при создании?
const oldNote = {
id: "someid",
text: "sometext",
createdAt: new Date(2018, 11, 24, 10, 33, 30, 0),
updatedAt: new Date(2018, 11, 24, 10, 33, 30, 0)
}
const note = {
text: oldNote.text,
createdAt: firebase.firestore.Timestamp.fromDate(oldNote.createdAt),
updatedAt: firebase.firestore.Timestamp.fromDate(oldNote.updatedAt)
};
firestoredb.collection("notes").doc(oldNote.id).set(note).then((docRef) => {
//FIXME: createdAt and updatedAt aren't preserved, always today
}).catch((error) => {
console.error("Error setting user: ", error);
});
Вот облачные функции:
exports.updateCreatedAt = functions.firestore
.document("{collectionName}/{id}")
.onCreate((snap, context) => {
const now = admin.firestore.FieldValue.serverTimestamp();
return snap.ref.set(
{
createdAt: now,
updatedAt: now
},
{ merge: true }
);
});
exports.updateUpdatedAt = functions.firestore
.document("{collectionName}/{id}")
.onUpdate((change, context) => {
const newValue = change.after.data();
const previousValue = change.before.data();
if (
Boolean(newValue.updatedAt) &&
Boolean(previousValue.updatedAt) &&
newValue.updatedAt.isEqual(previousValue.updatedAt)
) {
const now = admin.firestore.FieldValue.serverTimestamp();
return change.after.ref.set({ updatedAt: now }, { merge: true });
} else {
return false;
}
});