Kotlin和Firebase云function的update()方法

我正在使用Kotlin为Firebase云端function生成Javascript代码。

我想调用update方法,传递一些值作为参数。 在Kotlin中,我必须传递一个Map作为update()的参数:

val map = mutableMapOf() //also tried with a Hashmap: same result //generate some values for(i in 0 until 3){ map.put("key$i", i) } console.log(map.keys.toList().toString()) //log map keys console.log(map.values.toList().toString()) //log map values ref.child("values").update(map) 

Kotlin生成的JavaScript代码:

 var LinkedHashMap_init = Kotlin.kotlin.collections.LinkedHashMap_init_q3lmfv$; function main$lambda(event){ var map = LinkedHashMap_init(); for (var i = 0; i < 3; i++) { map.put_xwzc9p$('key' + i, i); } console.log(toList(map.keys).toString()); console.log(toList(map.values).toString()); ref.child('values').update(map); } 

在我的Firebase控制台中,这是2个日志的结果。 似乎表明地图是正确的:

 [key0, key1, key2] [0, 1, 2] 

但是update()不起作用:函数日志显示该消息:

 Error: Reference.update failed: First argument contains an invalid key (this$AbstractMutableMap) in property 'games.test.values._keys_qe2m0n$_0'. Keys must be non-empty strings and can't contain ".", "#", "$", "/", "[", or "]" at /user_code/node_modules/firebase-admin/node_modules/@firebase/database/dist/cjs/src/core/util/validation.js:139:27 at Object.exports.forEach (/user_code/node_modules/firebase-admin/node_modules/@firebase/util/dist/cjs/src/obj.js:37:13) at Object.exports.validateFirebaseData (/user_code/node_modules/firebase-admin/node_modules/@firebase/database/dist/cjs/src/core/util/validation.js:132:16) at /user_code/node_modules/firebase-admin/node_modules/@firebase/database/dist/cjs/src/core/util/validation.js:223:17 at Object.exports.forEach (/user_code/node_modules/firebase-admin/node_modules/@firebase/util/dist/cjs/src/obj.js:37:13) at Object.exports.validateFirebaseMergeDataArg (/user_code/node_modules/firebase-admin/node_modules/@firebase/database/dist/cjs/src/core/util/validation.js:221:12) at Reference.update (/user_code/node_modules/firebase-admin/node_modules/@firebase/database/dist/cjs/src/api/Reference.js:140:22) at main$lambda (/user_code/index.js:87:25) at Object. (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:59:27) at next (native) 

但最后,如果我手动将js代码写入函数,它的工作原理:

 var map = {} for (var i = 0; i < 3; i++) { map["key"+i] = i } ref.child("values").update(map) 

问候。

Kotlin显然是通过调用mutableMapOf来创建一个LinkedHashMap 。

update()需要一个JavaScript对象,它的普通的,简单的属性应该用来更新文档。

我相当肯定,在JavaScript中的LinkedHashMap的实现有很多的对象属性将违反规定的约束,你可以从错误消息中看到。

你不能简单地传递任何你想要update()的对象update() 。 您需要传递一个仅包含要update()的键和值的对象update() 。 该方法根本不需要像LinkedHashMap那样复杂的东西。 相反,你需要编写一些可以编译成简单的JavaScript对象的东西。

也许这将有助于阅读 。

感谢Doug的回答 ,我写了一小段代码将一个简单的键/值javascript对象包装到一个Kotlintypes的对象中:

 class JsWrapperMap { private val map: dynamic = js("({})") operator fun get(key: K): V = map[key] operator fun set(key: K, value: V) { map[key] = value } fun toJs(): dynamic = map } /** * Returns an empty new [JsWrapperMap] */ fun  jsMapOf(): JsWrapperMap = JsWrapperMap() /** * Returns an empty new [JsWrapperMap] of type  */ fun jsMapOfAny(): JsWrapperMap = JsWrapperMap() 

它可以像这样使用:

 val map = jsMapOf() map["key_0"] = 12 map["key_1"] = 36 ref.child("values").update(map.toJs()) 

我打开该代码的任何建议:)