我试图弄清楚如何在我的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);
});
};
答案 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);
});
}