我正在考虑将一些基本的JS转换为Kotlin,但我仍然坚持使用new
关键字。我不知道如何将以下JS转换为Kotlin
var FCM = require('fcm-node');
var fcm = new FCM('YOURSERVERKEYHERE');
var message = { ... };
fcm.send(message, function(err, response){ ... }
我试过
fun sendTestPush() {
val FCM = require("fcm-push")
val fcm = new FCM("YOURSERVERKEYHERE")
val data = Data("Title", "Message")
val message = Message("registration_id", data)
fcm.send(message)
}
data class Message(val to: String, val data: Data)
data class Data(val title: String, val message: String)
我得到了编译错误Unresolved reference: new
,因为Kotlin没有它。
如果没有“新”,我会得到预期的错误Attempting to TypeError: Cannot read property 'send' of undefined
有什么想解决这个问题吗?
编辑:FCM类是npm包https://www.npmjs.com/package/fcm-push
答案 0 :(得分:2)
很抱歉,但您标记为正确的答案实际上是不正确的。我必须告诉你,因为正在寻找正确答案的人会找到并编写错误的代码。通常,您不应直接从Kotlin调用require
函数。相反,您应该将@JsModule
与external
声明一起使用。在您的特定情况下,它将是这样的:
@JsModule("fcm-push")
external class FCM(serverKey: String) {
fun send(message: Any?, callback: (err: Any?, response: Any?) -> Unit)
fun send(message: Any?): Promise<Any>
}
val serverKey = "YOURSERVERKEYHERE"
val fcm = FCM(serverKey)
//...
fcm.send(message)
此外,您应该将commonjs
传递给moduleKind
编译器标志。有关完整说明,请参阅corresponding documentation page。
答案 1 :(得分:1)
require function in Kotlin与您的JS代码中可能使用的require in NodeJS不同。
无论您的FCM类是什么,只需在没有new
关键字的情况下对其进行实例化。
答案 2 :(得分:1)
感谢来自@Claies的提示,我设法使用 js(...)
换行使其工作。~~~
val FCM = require("fcm-push")
val serverKey = "YOURSERVERKEYHERE"
val fcm = js("new FCM(serverKey)")
...
fcm.send(message) // now works
我不确定我对在kotlin中写一个字符串中的纯js感到非常满意,所以我希望有一个更好的方法,我错过了。
编辑:上述工作,但不理想,请参考接受的答案,以便更好地实施