Firestore onSnapshot возвращает неправильный формат метки времени - PullRequest
0 голосов
/ 26 декабря 2018

Когда я получаю документ FireStore с использованием .get(), мое поле времени возвращает это значение: createdAt: "2018-12-25T01:04:05.189Z", но когда я использую onSnapshot, поле времени возвращает другое значение:

1) использование onSnapshot:

  componentDidMount() {
    this.unsubscribe = this.ref.doc('HCNFO3ZKlFNKK71JMzo8').onSnapshot(this.onCollectionUpdate)
  }

  componentWillUnmount() {
    this.unsubscribe();
  }

  onCollectionUpdate = (querySnapshot) => {
    this.setState({
      theLocation: querySnapshot.data()
    })
  }

возвращает: mylocations: { createdAt: Timestamp {seconds: 1545723905, nanoseconds: 177000000} }

2) в облачных функциях с использованием .get()

.then(() => {
  return firebaseAdminSDK.firestore().collection('locations').doc('HCNFO3ZKlFNKK71JMzo8').get()
})

возвращает: mylocations: { createdAt: "2018-12-25T07:45:05.177Z" }

при сохранении местоположения я использовал data.createdAt = FieldValue.serverTimestamp(); для облачных функций

Есть идеи, что происходит?

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Завершено использованием moment.utc() для облачных функций.

Заменено const createdAt = FieldValue.serverTimestamp() на const createdAt = moment.utc().valueOf()

. После этого поле createdAt возвращает одинаковое значение как для облачных функций, так и для выборки веб-интерфейса, поскольку его метка времени хранится как number вместо timestamp.в пожарном магазине.

0 голосов
/ 26 декабря 2018

Новый объект Timestamp с секундами и наносекундами в клиентской библиотеке javascript будет временной меткой по умолчанию, которая заменит старые объекты javascript Date в временных метках firebase.Вы должны принять новое поведение и обновить свой код, чтобы использовать новые объекты отметок времени.

Чтобы получить объект Date из отметки времени, используйте метод toDate():

const timestamp = snapshot.get('createdAt');
const date = timestamp.toDate();

Вы можете сделать поведение новой отметки времени поведением по умолчанию в приложении и облачных функциях и обновить свой код так, чтобычто при удалении объектов Date ваше приложение не сломается.Чтобы использовать новую метку времени, вы можете добавить timestampsInSnapshots: true в настройки Firestore:

// javascript sdk
firebase.firestore().settings({
   /* other settings */
   timestampsInSnapshots: true
})

// admin sdk
admin.firestore().settings({
   /* other settings */
   timestampsInSnapshots: true
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...