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())
我打开该代码的任何建议:)