#javascript #firebase #google-cloud-firestore
#javascript #firebase #google-cloud-firestore
Вопрос:
Я пытаюсь выполнить простой запрос из моей базы данных firestore, но мне не хватает чего-то очень очевидного. Я пытался искать в Интернете, но ничего не работает. Для некоторого фона у меня есть коллекция «cf», в которой я пытаюсь запросить объекты, у которых значение «hsc» равно «1», но я ничего не получаю взамен.
exports.getOneTodo = (request, response) => {
db
.collection('cf')
.where("hsc", "==", "1")
.get()
.then((doc) => {
if (!doc.exists) {
return response.status(404).json(
{
error: 'Todo not found'
});
}
TodoData = doc.data();
TodoData.todoId = doc.id;
return response.json(TodoData);
})
.catch((err) => {
console.error(err);
return response.status(500).json({ error: error.code });
});
};
Ниже приведены правила firestore.
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write
}
}
}
Я тестирую это через почтальона. Я попытался изменить правила firebase, чтобы они были верными для чего угодно, но, похоже, ничего не работает.
ОБНОВЛЕНИЕ: ниже показано, как я инициализировал свою базу данных
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();
module.exports = { admin, db };
Комментарии:
1. При переполнении стека не показывайте изображения кода и текста. Скопируйте код в вопрос и отформатируйте его так, чтобы его было легко читать, копировать и искать.
2. Извините, просто изменил его.
3. Пожалуйста, также измените свои правила безопасности.
4. Просто изменил их тоже 🙂
5. Если вы жестко
"1"
закодируете строку в запросе, вы все равно не получите результатов?
Ответ №1:
Ваш код ожидает один документ, но он должен быть подготовлен к тому, что запрос вернет несколько документов. Когда вы запускаете get()
объект запроса, он выдает объект QuerySnapshot. Как вы можете видеть из документации API, у него нет exists
свойства. Проверка этого свойства всегда будет «false». Вместо этого вам нужно проверить результаты, чтобы сначала посмотреть, были ли какие-либо документы, а затем получить первый:
db
.collection('cf')
.where("hsc", "==", "1")
.get()
.then((qsnapshot) => {
if (qsnapshot.docs.length > 0) {
const dsnapshot = qsnapshot.docs[0];
// send the response using dsnapshot.data()
}
else {
// send the response saying nothing was found
}
})
Ответ №2:
теперь вам нужно использовать
db.collection("id").whereGreaterThan("field","value")
.whereEqualTo("field","value")
.whereLessThen("field","value")