#node.js #google-cloud-firestore #google-cloud-functions
#node.js #google-облако-firestore #google-cloud-функции
Вопрос:
Я просто пытаюсь получить данные документа в одной из моих вызываемых функций firebase, я уже знаю ее идентификатор из предыдущего запроса.
Проблема в том, что результирующий объект из [...].doc(id).get()
метода не имеет .data()
метода или exists
члена.
Я попытался перечислить свойства объекта с помощью Object.getOwnPropertyNames(snapshot);
и не смог найти exists
или data()
.
Получение ссылки на документ работает с помощью ref
, но у меня нет доступа к другим методам / элементам.
Вот как я получаю свои данные, используя два запроса (обратите внимание на мою консоль.регистрируйте вызовы) :
return firestore.collection("/teams").where("login", "==", data.login).get()
.then( (snapshot) => {
if(!snapshot.empty) {
user = snapshot.docs[0].data().login;
id = snapshot.docs[0].id;
console.log(snapshot.docs);
return firestore.collection("/passwords").doc(id).get();
} else {
return {
success: false,
error: 2
};
}
})
.then((snapshot) => {
console.log(snapshot);
if(snapshot.hasOwnProperty("exists") amp;amp; snapshot.exists) {
return bcrypt.compare(data.password, snapshot.data().password);
} else {
return {
success: false,
error: 2
};
}
})
Вот вывод из моего первого console.log (я отключил часть проверки, чтобы сэкономить место) :
[ QueryDocumentSnapshot {
_ref:
DocumentReference {
_firestore: [Object],
_validator: [Object],
_referencePath: [Object] },
_fieldsProto:
{ colour: [Object],
name: [Object],
teammates: [Object],
login: [Object] },
_serializer:
Serializer {
timestampsInSnapshotsEnabled: true,
createReference: [Function] },
_validator:
Validator {
... },
_readTime: Timestamp { _seconds: 1553530847, _nanoseconds: 875308000 },
_createTime: Timestamp { _seconds: 1553530458, _nanoseconds: 66673000 },
_updateTime: Timestamp { _seconds: 1553530458, _nanoseconds: 66673000 } } ]
Вот вывод из моей второй консоли.log :
QueryDocumentSnapshot {
_ref:
DocumentReference {
_firestore:
Firestore {
_validator: [Object],
_clientPool: [Object],
_settingsFrozen: true,
_clientInitialized: [Object],
_initalizationSettings: [Object],
_serializer: [Object],
_timestampsInSnapshotsEnabled: true,
_referencePath: [Object],
_preferTransactions: true,
_lastSuccessfulRequest: 1553530848171 },
_validator:
Validator {
... },
_referencePath:
ResourcePath {
segments: [Array],
projectId: 'rally-gccd',
databaseId: '(default)' } },
_fieldsProto:
{ password:
{ stringValue: '$2b$10$Xy1fCI.mKxvBhCHGimNqK.mPGU4lb1p.6pQgqacnnAUYjPomIWyaa',
valueType: 'stringValue' } },
_serializer:
Serializer {
timestampsInSnapshotsEnabled: true,
createReference: [Function] },
_validator:
Validator {
... },
_readTime: Timestamp { _seconds: 1553530848, _nanoseconds: 114930000 },
_createTime: Timestamp { _seconds: 1553530458, _nanoseconds: 341760000 },
_updateTime: Timestamp { _seconds: 1553530458, _nanoseconds: 341760000 } }
Странно то, что я могу использовать .data () для первого снимка просто отлично, но не существует для второго снимка, хотя оба журнала указывают, что оба снимка имеют тип QueryDocumentSnapshot.
Комментарии:
1. Можете ли вы поделиться своим полным кодом облачной функции? Как вы определяете
firestore
?2.Он довольно большой, поскольку определено несколько функций. Но вот как я определил свою
firestore
переменную :const admin = require('firebase-admin');
const firestore = admin.firestore();
3. Вы уверены, что первый из них
snapshot
не является пустым и что значениеid
является правильным?4. Я почти уверен, что мой фактический
snapshot
действителен, поскольку вы можете видеть данные моего документа в_fieldsProto
элементе, с моим необходимым строковым значением в консоли. журнал моего снимка.5. Вы предполагаете, что вывод консоли. войти в свой код — это то, что вы показываете в вопросе? Я бы ожидал, что ваша консоль. войдите, чтобы отобразить одну из двух вещей: либо DocumentSnapshot (не QueryDocumentSnapshot), либо статический объект при ошибке.
Ответ №1:
Я решил проблему, вложив обещание получения второго документа в обещание запроса первого документа. Это далеко не идеально, поскольку немного более запутанно, но, по крайней мере, это работает.