我正在尝试学习如何使用Firestore。
google documentation说尝试这种格式:
db.collection("users").get().then((querySnapshot) => {
querySnapshot.forEach((doc) => {
console.log(`${doc.id} => ${doc.data()}`);
});
});
因此,我用它来做到这一点(将数据库更改为fsDB,将“用户”更改为“新闻通讯”
fsDB.collection("newsletters").get().then((querySnapshot) => {
querySnapshot.forEach((doc) => {
console.log(`${doc.id} => ${doc.data()}`);
});
});
尝试此操作时,出现一条错误,提示未定义querySnapshot。附有错误消息的屏幕截图。
我看过this post并尝试了以下建议:
fsDB.collection("newsletters").query.get().then(function(querySnapshot) {
if (querySnapshot.empty) {
console.log('no documents found');
} else {
querySnapshot.docs.map(function (documentSnapshot) {
console.log(documentSnapshot.data().name);
});
}
});
这种尝试会使用if语句生成一个解析错误,但是我也找不到解决此问题的方法。
这必须有一个简单的解决方案,但我不知道如何从数据库中获取记录。
下次尝试
我尝试将代码移到return语句上方,并按如下所示的屏幕快照所示放入变量中,但仍会产生错误,如图所示。无论我保留还是丢失querySnapshot的方括号,这些错误都是相同的。
添加状态
class Fndate extends React.Component {
state = {
options: [],
anzic: [],
country: [],
region: [],
}
selectCountry (val) {
this.setState({ country: val });
}
selectRegion (val) {
this.setState({ region: val });
}
async componentDidMount() {
// const fsDB = firebase.firestore(); // Don't worry about this line if it comes from your config.
let options = [];
await fsDB.collection("abs_for_codes").get().then(function (querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc.id, ' => ', doc.data());
options.push({
value: doc.data().title.replace(/( )/g, ''),
label: doc.data().title + ' - ABS ' + doc.id
});
});
});
let anzic = [];
await fsDB.collection("anzic_codes").get().then(function (querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc.id, ' => ', doc.data());
anzic.push({
value: doc.data().Title.replace(/( )/g, ''),
label: doc.data().Title + ' - ANZIC ' + doc.id
});
});
});
await fsDB
.collection("newsletter")
.get().then((querySnapshot) => {
querySnapshot.forEach((doc) => {
console.log(`${doc.id} => ${doc.data().email}`);
}
);
});
this.setState({
options,
anzic
});
}
答案 0 :(得分:1)
我相信您正在使用React,而我刚意识到您正在render
方法中调用该方法。
尝试在componentDidMount
中进行操作。可以找到参考文献here
因此您的代码将如下所示:
class YourClass extends React.Component {
componentDidMount(){
fsDB.collection("newsletters").get().then((querySnapshot) => {
querySnapshot.forEach((doc) => {
console.log(`${doc.id} => ${doc.data()}`);
});
});
}
render(){
return (....your existing jsx....)
}
}
请注意,我不知道您的类名或组件的定义方式。但是我只是说,您需要在componentDidMount
中移动代码。
我们看不到您的整个文件。但我确定这是语法错误(尤其是JSX)
答案 1 :(得分:0)
我认为您应该摆脱“ .query”。
如果集合中有数据,则.empty
返回false
。
但我想知道,为什么querySnapshot
在您的情况下没有定义。
db.collection("lessons").get()
.then(function(querySnapshot) {
if (!querySnapshot.empty) {
querySnapshot.docs.map(function(documentSnapshot) {
console.log(documentSnapshot.data().name);
})
} else {
console.log('no documents found');
}
});
控制台
答案 2 :(得分:-1)
您可以为此使用自动脚本。 您只需要python和firebase_admin。