javascript映射到Firestore->错误:参数“ data”的值不是有效的Firestore文档。输入的内容不是普通的JavaScript obj

时间:2020-08-05 02:35:19

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

尝试使用javascript在云中将JavaScript中的地图变量值设置为将文档存储为地图字段,以将其存储为地图字段。它失败并显示错误-错误:参数“ data”的值不是有效的Firestore文档。输入不是普通的JavaScript对象(可在field中找到。
map_field:myMap引起了问题。那么如何在firestore文档中将javascript映射设置为map字段?

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警告避免嵌套promises promise / no-nesting

108:34警告避免嵌套promises promise / no-nesting

2 个答案:

答案 0 :(得分:0)

就像错误消息所指示的那样,不允许您将映射插入数据库。一种解决方法是将其转换为JSON对象,如下所示:

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

那应该可以解决问题。

108:34警告避免嵌套promises promise / no-nesting

这是ESLINT被设置为避免promise嵌套的结果。我不知道函数结果中的潜在问题,但是当深入嵌套代码时,确实会使理解代码更加困难,并且可能延长代码的运行时间。您可以使用javascript async await函数来消除嵌套所述promise的需要。

答案 1 :(得分:0)

Firestore不支持

JS映射。使用普通的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)

check here for all supported data types