Android调用Cloud Function传JSON报错:Cannot read properties of undefined (reading 'map')
解决Cloud Function调用时的"Cannot read properties of undefined (reading 'map')"错误
错误原因
- 函数类型不匹配:Android端用
getHttpsCallable调用,对应的Cloud Function应该使用onCall类型,而非你当前用的onRequest(普通HTTP函数)。两者的请求参数格式完全不同,导致request.body.data无法正确解析出传递的参数。 - 参数传递方式错误:Android端手动拼接了JSON字符串作为参数,但Callable函数要求传递键值对对象(Map),字符串会被当作普通参数,无法解析出
users数组。
修正后的Cloud Function代码
exports.getUsers = functions.https.onCall(async (data, context) => { // 严谨校验参数格式 if (!data?.users || !Array.isArray(data.users)) { throw new functions.https.HttpsError('invalid-argument', '参数错误:必须包含users数组'); } const users = data.users; const phonelist = users.map(user => { if (!user.phone) { throw new functions.https.HttpsError('invalid-argument', 'users数组元素必须包含phone字段'); } return user.phone.toString(); }); const userlist = []; const snapshot = await db.collection("users").get(); snapshot.docs.forEach((userDoc) => { const phone = userDoc.get("phone"); if (!phone) return; // 若需完全匹配手机号,用下面的判断;若需部分匹配,保留你原有的reduce逻辑 const isMatch = phonelist.includes(phone.toString()); if (isMatch) { userlist.push(userDoc.data()); } }); return { result: userlist }; });
修正后的Android调用代码
private fun addMessage(): Task<*>? { // 用Map构建参数,无需手动拼接JSON字符串 val user1 = mapOf("phone" to 55512345) val user2 = mapOf("phone" to 972525276676) val user3 = mapOf("phone" to 55512347) val usersList = listOf(user1, user2, user3) val data = mapOf("users" to usersList) return functions.getHttpsCallable("getUsers") .call(data) .addOnFailureListener { Log.d("DTAG", "调用失败: ${it.message}") } .addOnSuccessListener { result -> Log.d("DTAG", "调用成功: ${result.data.toString()}") } }
额外注意事项
- 部署前确保使用最新代码:执行命令
firebase deploy --only functions:getUsers - 数据库中
phone字段的类型要和代码中处理后的类型一致(比如统一为字符串),避免匹配失败 - Callable函数会自动处理错误抛出,Android端的
onFailureListener能捕获到具体错误信息
内容的提问来源于stack exchange,提问作者Dim
相关产品推荐
相关产品推荐

