, поэтому у меня есть функция вызываемого облака, подобная этой
exports.callableModeratorSendNotification = functions.https.onCall(async (data, context) => {
try {
const platform = data.platform
const priority = data.priority
const message = data.message
const moderatorID = context.auth.uid
// check if moderator have authorization to send notification and check if moderator is active or not
const moderatorSnapshot = await db.doc(`moderators/${moderatorID}`).get()
const moderator = moderatorSnapshot.data()
if ( !moderator.canSendNotification || !moderator.isActive) {
throw new functions.https.HttpsError('invalid-moderator', 'Moderator is invalid. only active moderator who has authorization that can verify a user.')
}
let query
const now = new Date()
const xMonthsAgo = moment().subtract(1,"months").toDate()
query = db.collection(`devices`)
.where("lastActivity","<=",now)
.where("lastActivity",">=",xMonthsAgo)
if ( platform !== "All") {
query = query.where("platform","==",platform) // iOS or Android
}
const devicesQuerySnapshot = await query.get()
devicesQuerySnapshot.docs.forEach( deviceSnapshot => {
const device = deviceSnapshot.data()
console.log(device.userID)
})
{result: 'success'}
} catch(error) {
console.log(error)
return null
}
})
, на данный момент эта функция просто регистрирует идентификатор пользователя. и эта функция вернет 200 таких кодов в консоли
, но проблема на стороне клиента .... Я использую Android Чтобы вызвать эту функцию, например,
fun sendNotification(platform: String, priority: String, message: String) : Task<String> {
// Create the arguments to the callable function.
val data = hashMapOf(
"platform" to platform,
"priority" to priority,
"message" to message
)
return functions
.getHttpsCallable("callableModeratorSendNotification")
.call(data)
.continueWith { task ->
val result = task.result?.data as String
result
}
}
, а затем использовать ее следующим образом
sendNotification(selectedPlatform,selectedPriority,message).addOnSuccessListener {
toast("successful")
}.addOnFailureListener {
toast("failed")
}
проблема в том, что, хотя код состояния в консоли равен 200, но addOnFailureListener
всегда будет называться Я ожидаю, что addOnSuccessListener
будет вызван, если ответ 200
. Вот исключение, пойманное прослушивателем ошибок
java .util.HashMap не может быть приведен к java .lang.String 2020-02-04 11: 30: 09.023 26024-26024 / com.
java .lang.ClassCastException: java .util.HashMap нельзя привести к java. lang.String
в этой строке?
val result = task.result?.data as String
откуда берется результат. это представляет return
на моей вызываемой функции? Я предполагаю, что вызываемая функция должна возвращать обещание, такое как триггер облачной функции