javascript Сопоставить с Firestore -> Ошибка: значение аргумента «данные» не является допустимым документом Firestore. Ввод не простой JavaScript obj - PullRequest
0 голосов
/ 05 августа 2020

пытается установить значение переменной карты в javascript для документа firestore в качестве поля карты с помощью облачной функции. Сбой с ошибкой - Ошибка: значение аргумента «данные» не является допустимым документом Firestore. Вход не является обычным объектом JavaScript (находится в поле. map_field: myMap вызывает проблему. Итак, как мне установить javascript map как поле карты в документе firestore?

admin.firestore().collection("users").doc("test").set({
                                          name: "Los Angeles",
                                          state: "CA",
                                          map_field: myMap // map variable
                                      })

Полный код здесь: я собираю данные из нескольких документов firestore и пытаюсь вставить в новый документ.

Код ------------------------->

exports.fxname= functions.https.onRequest((request, response) => {
 collectionRef = admin.firestore().collection('user/doccx/collx');

let myMap = new Map();

collectionRef.listDocuments().then(documentRefs => {
                          console.log('Fetching each document:console log');
                          return  admin.firestore().getAll(...documentRefs)
                          .then(documentSnapshots => {
                                for (let documentSnapshot of documentSnapshots) {
                                 let name = documentSnapshot.get('aa');
                                 let totalScore= documentSnapshot.get('bb');
                                
                                 myMap.set(name, totalScore.toString());
                                }
                                functions.logger.log("calculation done: ");
                                console.log(Array.from(myMap) ); //prints values
                                var keys = Object.keys(myMap);
                                keys.forEach(key=>{
                                  console.log(key + '|' + myMap[key]); //this is not printing any value
                                });

                                 admin.firestore().collection("users").doc("test").set({
                                          name: "Los Angeles",
                                          state: "CA",
                                          country: myMap
                                      }).then(function() {
                                           functions.logger.info("Insert Successful !", {structuredData: true});
                                            return;
                                        })
                                        .catch(function(error) {
                                            functions.logger.error("Error writing document: ", error);
                                        });


                                return;
                           }).catch(function(error) {
                              functions.logger.error("Error 1: ", error);
                              });
                       }).catch(function(error) {
                             functions.logger.error("Error 2: ", error);
                           });
 response.send("Hello from Firebase Outside!");`enter code here`

});

Не имеет отношения к проблеме, но также получает предупреждение ниже. Это связано с вложением .then. какие-либо предложения по переписыванию вышеуказанного кода?

108: 34 предупреждение Избегайте вложенных обещаний обещание / отсутствие вложенности

108: 34 предупреждение Избегайте вложенных обещаний обещание / отсутствие вложенности

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

JS карты не поддерживаются в firestore. используйте обычные JS объекты и вставьте их в свою базу данных, например:

let contact = {'Jessie':{phone: "213-555-1234", address: "123 N 1st Ave"}}

// example overwrite a doc in firestore
db.collection("contacts").doc('test').set(contact)

проверьте здесь все поддерживаемые типы данных

0 голосов
/ 05 августа 2020

Как указано в сообщении об ошибке, вам не разрешено вставлять карты в базу данных. Обходной путь - просто преобразовать это в объект JSON, например:

let myMap = {};
myMap[name] = totalScore.toString();

Это должно решить проблему.

108: 34 предупреждение Избегайте вложенных обещаний обещание / нет -nesting

Это результат настройки ESLINT, чтобы избежать вложенности обещаний. Я не знаю потенциальных проблем с функциональными результатами, но это значительно усложняет понимание кода и потенциально увеличивает время выполнения кода, когда он глубоко вложен. Вы можете использовать функции javascript asyn c await, чтобы исключить необходимость вложения указанных обещаний.

...