TypeError: elements.get не является ошибкой функции в функциях Firebase - PullRequest
0 голосов
/ 18 июня 2019

Я получаю ниже error log при запуске функции firebase, я пытаюсь получить документы и значения внутри recentPosts поля массива.

Error: Unknown error status: Error: Unknown error status: TypeError: elements.get is not a function
    at new HttpsError (/srv/node_modules/firebase-functions/lib/providers/https.js:90:19)
    at admin.firestore.collectionGroup.where.get.then.catch.error (/srv/lib/index.js:71:15)
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7)

Класс:

class PostTable {
   public commentCount : number;

   public dateTime : number;

   public docId : string;

   public post : string;

   public userId : string;

   public userName : string;

   constructor(commentCount: number, dateTime: admin.firestore.Timestamp, docId: string, post : string, userId : string, userName : string) {

       this.commentCount = commentCount
       this.dateTime=  dateTime.toDate().getTime()
       this.docId=docId
       this.post=post
       this.userId=userId
       this.userName=userName
   }

}

функция:

export const getPosts = functions.https.onCall((data, context) => {

   if (!context.auth) {
      // Throwing an HttpsError so that the client gets the error details.
      throw new functions.https.HttpsError('failed-precondition', 'The function must be called ' +
          'while authenticated.');
    }


    let responseCollection : PostTable[] = []

         admin.firestore().collectionGroup('recentPostColl').where('users', "array-contains",context.auth.token.name)
                                 .get()

         .then(collectionOfPosts => {

            if(!collectionOfPosts.empty)
            {

               collectionOfPosts.forEach(element => {

                  let collection : Map<String, Object>[] = element.get('recentPosts')

                  collection.forEach(elements => {

                     try {
                        const p : PostTable = new PostTable(elements.get('commentCount')as number, elements.get('dateTime') as admin.firestore.Timestamp
                        ,elements.get('docId') as string,elements.get('post') as string, elements.get('userId') as string, elements.get('userName') as string);

                        const stamp : admin.firestore.Timestamp = elements.get('dateTime') as admin.firestore.Timestamp

                        const date : Date = stamp.toDate()

                        if(date.getTime() > new Date(data.date).getTime())
                        {

                              responseCollection.push(p)
                        }
                     } catch (error) {
                        throw new functions.https.HttpsError(error, 'Constructor error');
                     }

                  });
               });

            }


   })

   .catch(error =>{
      throw new functions.https.HttpsError(error, 'code error');
   })

   return responseCollection


})

Документ:

enter image description here

1 Ответ

1 голос
/ 18 июня 2019

В вашем коде collectionOfPosts является QuerySnapshot объектом.Вы используете его forEach метод для итерации QueryDocumentSnapshot объектов, содержащихся в нем.Затем вы используете get (), чтобы извлечь конкретное поле из этого снимка.Это поле будет представлено как простой тип массива JavaScript, так как поле является массивом.Это не строго типизированный массив - вы должны предполагать, что все типы полей являются простыми типами JavaScript, а не типами коллекции TypeScript.Вы не можете просто привести простые типы JavaScript к типам коллекций TypeScript.

Вам нужно будет предоставить конкретное, безопасное утверждение, которое можно сделать в отношении этого поля (при условии, что оно содержит именно то, что вы думаете) в JavaScriptтермины:

let collection : object[] = element.get('recentPosts')

Затем вы можете индексировать в collection, как если бы это был обычный массив:

let item = collection[0]

или выполнять итерации, как любой другой массив JavaScript.

Отдельные элементы будут иметь тип object, и вы также будете иметь с ними дело, как если бы они были простыми старыми объектами JavaScript.

Если вы хотите иметь дело с типами коллекций TypeScript, вам придется написатьнекоторый код для преобразования всех этих массивов и объектов JavaScript в их эквиваленты типа коллекции TypeScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...