Firebase - пожарный магазин создан на отметках времени - реагирует - PullRequest
2 голосов
/ 08 мая 2019

Я пытаюсь выяснить, как добавить метки времени к документам, созданным в моей базе данных firestore.

Я прочитал и попробовал каждое из предложений в этом сообщении .

Я прочитал ссылки на документацию в этом посте и не могу понять шаги, которые я должен попытаться реализовать, чтобы записать метку времени для даты создания документа.

В моих настройках Firebase у меня есть:

firebase.initializeApp(config);
const database = firebase.database();
const fsDB = firebase.firestore();
const settings = { timestampsInSnapshots: true };


export { firebase, database as default, fsDB, settings };

Я действительно не уверен, что const настроек необходим, потому что многие посты по этому вопросу предполагают, что теперь это какая-то настройка по умолчанию в FireBase (яне могу найти документацию по firebase по этому вопросу).

Тогда, в моей форме, у меня есть:

import * as firebase from '../../../firebase';
import { fsDB } from "../../../firebase";

Я не уверен, почему необходимо импортировать эти файлы firebase напрямуюпотому что они находятся в точке входа в приложение, но несколько постов предложили это.

class Preregistration extends React.Component {
  constructor(props) {
    super(props);
    this.state = {selectedValue: null};
    this.state = {createdAt: firebase.database.serverTimestamp()};
  }

  render() {
    return (
      <div>
        <h1>Hello, world!</h1>
        <h2>It is {this.state.createdAt.toLocaleTimeString()}.</h2>
      </div>
    );
  }
}
export default Preregistration;

Я также пробовал:

this.state = {createdAt: firebase.fsDB.serverTimestamp()};

this.state = {createdAt: firebase.firestore.FieldValue.serverTimestamp()};


this.state = {createdAt: firebase.FieldValue.serverTimestamp()};

Ни один из этих подходов не работает.Должен быть простой способ добавить метку времени в документ, чтобы я мог отслеживать, когда они были созданы.Почему так сложно понять, как это сделать?

Когда я пытаюсь:

this.state = {createdAt: firebase.fsDB.FieldValue.serverTimestamp()};

(обратите внимание - мой firestore сохраняется как fsDB),

Iполучить ошибку, которая говорит:

TypeError: Cannot read property 'serverTimestamp' of undefined

Я подумал, может быть (из-за способа, которым я определяю свою конфигурацию) выражение может означать:

this.state = {createdAt: fsDB.FieldValue.serverTimestamp()};

, но это выдает то же самоесообщение об ошибке

Совет по обращению в службу поддержки Firebase предлагает:

createdAt: firebase.firestore.Timestamp.now(); 

При попытке получить сообщение об ошибке:

TypeError: Невозможно прочитать свойство 'Timestamp'of undefined

Было бы здорово узнать, как использовать временные метки в пожарном хранилище.

Документы Firebase говорят:

var docRef = db.collection ('objects').doc ('some-id');

// Update the timestamp field with the value from the server
var updateTimestamp = docRef.update({
    timestamp: firebase.firestore.FieldValue.serverTimestamp()
});

Когда я пытаюсь это сделать, я получаю сообщение об ошибке:

TypeError: Невозможно прочитать свойство 'FieldValue' из неопределенного

Я пробовал каждую из этих вещей, устанавливая как начальное значение, так и отдельную попытку setState со значением.Ни один из них не работает.

Принимая предложение Мюррея, приведенное ниже, я попробовал обе эти закомментированные строки, как показано и в {}, и в ().Ни одна из этих попыток не работает (страница не будет отображаться для ошибок, содержащихся в них (не удалось скомпилировать, ожидается; сообщения об ошибках). Я высыпал, в каждом месте я могу думать, чтобы положить их, но не могу получить этоподход к работе.

handleSubmit = (formState, { resetForm }) => {
    // Now, you're getting form state here!
    console.log("SUCCESS!! :-)\n\n", formState);
    fsDB
      .collection("contact")
      .add(formState)
      // .set createdAt: firebase.firestore.FieldValue.serverTimestamp()
      // .add createdAt: firebase.firestore.FieldValue.serverTimestamp()
      .then(docRef => {
        console.log("docRef>>>", docRef);
        this.setState({ selectedValue: null });
        resetForm(initialValues);
      })
      .catch(error => {
        console.error("Error adding document: ", error);
      });
  };

1 Ответ

0 голосов
/ 13 мая 2019

Чтобы получить метку времени Firestore, firebase.firestore.FieldValue.serverTimestamp() - правильный вызов.Вот подвох: этот метод используется только в вызове DocumentReference .set() или .update() (или, я полагаю, CollectionReference .add()).Например, при добавлении нового документа в свою коллекцию «контакт» вы можете объединить formState с новым свойством «createAt», передав его методу .add():

handleFormSubmit(event) {
    // Now, you're getting form state here!
    console.log("SUCCESS!! :-)\n\n", formState);
    fsDB
      .collection("contact")
      .add({
        ...formState,
        createdAt: firebase.firestore.FieldValue.serverTimestamp()
      })
      .then(docRef => {
        console.log("docRef>>>", docRef);
        this.setState({ selectedValue: null });
        resetForm(initialValues);
      })
      .catch(error => {
        console.error("Error adding document: ", error);
      });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...