Я пытаюсь научиться пользоваться firestore.
документация гугла предлагает попробовать этот формат:
db.collection("users").get().then((querySnapshot) => {
querySnapshot.forEach((doc) => {
console.info(`${doc.id} => ${doc.data()}`);
});
});
Итак, я использовал это для этого (изменив db на fsDB и «пользователей» на «информационные бюллетени»
fsDB.collection("newsletters").get().then((querySnapshot) => {
querySnapshot.forEach((doc) => {
console.info(`${doc.id} => ${doc.data()}`);
});
});
Когда я пытаюсь это сделать, я получаю сообщение об ошибке, в котором говорится, что querySnapshot не определен. Скрин сообщения об ошибке прилагается.
Я видел эта почта и попробовал его предложение следующим образом:
fsDB.collection("newsletters").query.get().then(function(querySnapshot) {
if (querySnapshot.empty) {
console.info('no documents found');
} else {
querySnapshot.docs.map(function (documentSnapshot) {
console.info(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.info(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.info(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.info(`${doc.id} => ${doc.data().email}`);
}
);
});
this.setState({
options,
anzic
});
}
@Phil - это относится к этому оператору запроса: querySnapshot.forEach((doc) => { console.info(${doc.id} => ${doc.data()}
); });
Что точно является сообщением об ошибке? Если бы вы могли опубликовать скриншот, показывающий его контекст, это могло бы помочь. Вы абсолютно уверены, что код в вашем вопросе соответствует вашему фактическому коду, включая символы верхнего и нижнего регистра?
@Phil - скриншот прилагается
Я уверен. Я чередовал множественное и единственное число, чтобы убедиться, что не существует неписаных правил поиска записей. но та же ошибка сохраняется
Это ошибка линтинга (eslint/jslint). Похоже, это работает неправильно, потому что querySnapshot
определенно определено
я не знаю, что ты имеешь в виду
"не-недеф" не является ошибкой компиляции. Это исходит из вашего статического анализа кода / проверки синтаксиса ~ eslint.org/docs/rules/no-undef. По какой-то причине он помечает это как проблему, но это выглядит как ложное срабатывание.
Может быть глупая идея, но попробуйте убрать скобки вокруг querySnapshot
, например .then(querySnapshot => { ... })
Я пробовал это, но та же ошибка сохраняется
Если внимательно посмотреть на скриншот, вы увидите, что у вас смешанные кавычки, то есть "newsletters'
(двойная кавычка открыта, одинарная кавычка закрыта), поэтому я спрошу еще раз, уверены ли вы, что код в вашем вопросе соответствует вашему реальному коду?
Это все туда и обратно между единственным и множественным числом. теперь они совпадают, но проблема остается. Я на 100% уверен, что у меня есть коллекция под названием информационный бюллетень. Нижний регистр.
Меня интересует подсветка синтаксиса в строке 1003; он не должен быть полностью синим. Почти похоже, что у вас есть незавершенное строковое выражение. Не могли бы вы предоставить больше контекста для кода?
нет смысла в том, чтобы он находился в файле, в котором он находится, я просто пытаюсь научиться использовать firestore для извлечения данных. это внизу формы для создания записей в другой коллекции. в этой форме нет ошибок. Какую часть вы хотите увидеть?
Я не очень хорошо знаю JSX, но действительно ли функция рендеринга подходит для выполнения таких асинхронных операций? Я бы попробовал переместить этот код из шаблона в более скриптовую область.
ок - спасибо за подсказку. я попробую исследовать больше сегодня вечером.
Я попытался переместить его выше оператора return, но все еще есть ошибки. плохо продолжать смотреть сегодня вечером. Спасибо за вашу помощь
что в fsDB
?
@ЮниусЛ. - это мое определение базы данных: import { fsDB, firebase, settings } from "../../../../firebase";
@Mel, попробуйте console.info(querySnapshot) в своем коде. (в котором говорится, что querySnapshot не определен). Может быть что-то связанное с fsDB
а у вас есть данные в коллекции newsletters
?
@kkesley -- да
Я думаю, вам следует избавиться от «.query».
а .empty
возвращает false
, если у вас есть данные в коллекции.
но мне интересно, почему querySnapshot
undefined в вашем случае.
db.collection("lessons").get()
.then(function(querySnapshot) {
if (!querySnapshot.empty) {
querySnapshot.docs.map(function(documentSnapshot) {
console.info(documentSnapshot.data().name);
})
} else {
console.info('no documents found');
}
});
приставка
Это дает ту же ошибку - с оператором if, отмеченным выше. Спасибо за попытку помочь. Должен быть простой способ чтения данных из базы данных! Второй день пытаюсь узнать что это такое!
@Phil ответил на эту часть этой загадки выше
Я полагаю, что вы используете React, и я только что понял, что вы вызываете рассматриваемый метод в методе render
.
попробуйте сделать это в componentDidMount
. Ссылку можно найти здесь
поэтому ваш код будет таким:
class YourClass extends React.Component {
componentDidMount(){
fsDB.collection("newsletters").get().then((querySnapshot) => {
querySnapshot.forEach((doc) => {
console.info(`${doc.id} => ${doc.data()}`);
});
});
}
render(){
return (....your existing jsx....)
}
}
Обратите внимание, что я не знаю имени вашего класса или того, как вы определяете свой компонент. Но я просто говорю, что вам нужно переместить свой код в componentDidMount
.
Мы не смогли увидеть весь ваш файл. Но я уверен, что это синтаксическая ошибка (особенно с JSX)
Я попробовал это. Я получаю ту же ошибку, что и определение переменной над оператором return с другими константами. У меня это асинхронно. Те же синтаксические ошибки, которые показаны в моем посте выше, остаются, и консоль не регистрирует данные.
на самом деле это работает, если я поставлю на него тег ожидания. Спасибо за помощь
Я не могу понять пример в реагирующих документах для jsx, чтобы поймать данные и отобразить их. Это похоже на тот бит, который я ищу, но я не знаю, что с ним делать в этом операторе монтирования: const list = this.listRef.current;
@Mel, можешь ли ты дать нам весь компонент в своем вопросе? Таким образом, мы можем помочь вам в достижении вашей цели. Я предполагаю, что вам нужно использовать setState
для этого. И я не думаю, что вам нужно использовать ожидание, но я не могу вам больше помочь, так как я не мог видеть ваш компонент.
Привет @kkesley - состояние добавлено выше
@Mel, я думаю, вы использовали setState
в своем компоненте .. Вы можете повторно использовать это для своего «информационного бюллетеня». Значит ли это, что на ваш вопрос ответили?
вы ответили на мой первоначальный вопрос - я вижу данные в консоли, но я не вижу, как с ними работать, чтобы я мог отобразить их в своем просмотрщике
Для этого можно использовать автоматизированный скрипт. Все, что вам нужно, это python и firebase_admin.