云端函数中的QueryDocumentSnapshot中不存在data()方法

时间:2019-03-25 09:24:37

标签: node.js google-cloud-firestore google-cloud-functions

我只是想在我的firebase可调用函数之一中获取文档的数据,我已经从上一个查询中知道了它的ID。

问题是来自[...].doc(id).get()方法的结果对象没有.data()方法或exists成员。

我尝试使用Object.getOwnPropertyNames(snapshot);列出对象的属性,但找不到existsdata()

使用ref获取文档参考,但我无权访问其他方法/成员。

这是我使用两个查询(请注意console.log调用)获取数据的方式:

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") && 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 } } ]

这是第二个console.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 个答案:

答案 0 :(得分:0)

我通过将第二个文档get Promise嵌套在第一个文档查询Promise中来解决此问题。这不是理想的,因为它有点凌乱,但至少可以正常工作。