метод data () не существует в QueryDocumentSnapshot в облачных функциях

#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:

Я решил проблему, вложив обещание получения второго документа в обещание запроса первого документа. Это далеко не идеально, поскольку немного более запутанно, но, по крайней мере, это работает.