java - Firebase 云功能错误代码和错误消息在 Android 上始终为 Internal
问题描述
我正在为我的应用程序开发一项功能,一个用户可以使用云功能向另一个用户发送通知。我的功能和通知按预期工作,但我无法以正确的方式处理错误,因为我的 Android 代码上的错误总是“内部”。
这是我的Android代码:
public static Task<String> callFirebaseFunction(HashMap<String, Object> data, String funcion){
FirebaseFunctions mFunctions = FirebaseFunctions.getInstance();
return mFunctions
.getHttpsCallable(funcion)
.call(data)
.continueWith(new Continuation<HttpsCallableResult, String>() {
@Override
public String then(@NonNull Task<HttpsCallableResult> task) throws Exception {
return (String) task.getResult().getData();
}
});
}
这是我调用callFirebaseFunction的地方
Utilities.callFirebaseFunction(dataNoty, nombreFuncion)
.addOnCompleteListener(new OnCompleteListener<String>() {
@Override
public void onComplete(@NonNull Task<String> task) {
if ( !task.isSuccessful() ){
Exception e = task.getException();
if (e instanceof FirebaseFunctionsException) {
FirebaseFunctionsException ffe = (FirebaseFunctionsException) e;
FirebaseFunctionsException.Code code = ffe.getCode(); // It's always INTERNAL
Object details = ffe.getMessage(); // It's always INTERNAL
} else {
// handle error
}
} else {
// success
}
}
});
这是我的云功能代码
exports.helloWorld = functions.https.onRequest((req, res) => {
let data = req.body.data;
let id = data['id'].toString();
db.collection('users').doc(id).get()
.then((snapshot) => {
let infoUser = snapshot.data();
// Verifies data
if ( typeof infoUser !== "undefined" && Object.keys(infoUser).length > 0 ){
// Some code
} else {
throw new functions.https.HttpsError(
'invalid-argument', // code
'Error', // message
'User ' + id + ' not found' // details
);
}
}).then( () => {
console.log('Success');
return res.status(200).send("success");
}).catch( error => {
res.status(500).send(error.details);
return new functions.https.HttpsError(error.code, error.details);
});
});
我在我的 catch 段中尝试了不同版本的代码,例如:
.catch( error => {
res.status(500).send('Error');
throw new functions.https.HttpsError('invalid-argument', 'Error');
});
我不知道我应该如何制作我的 catch 段,我真的需要得到我在节点中抛出的错误(不仅仅是“内部”)。
解决方案
可调用函数需要以下格式:
exports.yourFunction = functions.https.onCall((data, context) => {
// ...
});
它与您正在使用的HTTP 触发的 Cloud Function不同。您仍然可以使用来自 Android 应用程序的 HTTP 请求来访问它,但如果您想使用mFunctions.getHttpsCallable(function).call(data)
,则需要使用我在上面链接的 Callable Cloud Function。
推荐阅读
- flutter - 从 Hive 框中删除的对象仍会加载到内存中
- c++ - 无法通过 cv::imshow() 显示窗口。我错过了什么?
- git - 如何只推送一个更改的文件
- javascript - 问题 nuxt.js Vue.js 与图像滑块更改照片第一通道第二张照片不显示 backslide1 未添加到 dom
- c# - 为什么序列化方法需要实例才能使用?
- r - 选择最接近定义值的元素,同时避免重复
- arduino - 如何使用 arduino uno 和 Arduino IDE 运行 Ai Thinker A9G gps 模块?
- javascript - 阿拉伯文本不会出现在 itextsharp c# .net 中
- ios - How should I got about setting the auto layout / constraints for my iOS view via Storyboard?
- ruby - Ruby if elsif else 问题