Firebase-在时间戳上创建了Firestore-反应

时间:2019-05-08 07:00:32

标签: reactjs firebase google-cloud-firestore

我试图弄清楚如何在我的Firestore数据库中创建的文档中添加时间戳。

我已阅读并尝试了this post中的每一项建议。

我已经阅读了该文章上的文档链接,而无法理解为记录文档创建日期的时间戳而应该尝试执行的步骤。

在我的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文档)。 / p>

然后,以我的形式,我有:

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),

我看到一条错误消息:

TypeError: Cannot read property 'serverTimestamp' of undefined

我想也许(由于我定义配置的方式)该表达式可能要读为:

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

但是会产生相同的错误消息

firebase支持凭单建议建议:

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

尝试此操作时,出现错误消息:

TypeError:无法读取未定义的属性“ Timestamp”

很高兴知道如何在Firestore中使用时间戳。

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的单独尝试。他们都不起作用。

根据下面的Murray R的建议,我尝试了显示在{}和()中的这两个注释行。这些尝试均无效(该页面无法呈现其中包含的错误(无法编译,预期;是错误消息)。我洒了;在所有可以想到的地方都可以考虑放置它们,但无法得到工作方式。

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 :(得分:0)

要获取Firestore时间戳,firebase.firestore.FieldValue.serverTimestamp()是正确的调用。这很重要:此方法仅在DocumentReference .set().update()调用(或我相信CollectionReference .add())中使用。例如,将新文档添加到“联系人”集合时,您可以将formState与新属性“ createdAt”组合在一起,然后将其传递给.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);
      });
}