Estou desenvolvendo um recurso para meu aplicativo, onde um usuário pode enviar uma notificação para outro usuário usando funções de nuvem. As minhas funções e as minhas notificações funcionam como esperado, mas eu não sou capaz de lidar com erros em um bom caminho, porque eu sempre obter "interno" como o erro no meu código do Android.
Aqui está o meu código para 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();
}
});
}
Aqui é onde eu chamo 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
}
}
});
E aqui está o meu código para a minha função nuvem
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);
});
});
Eu tentei diferentes versões do código no meu segmento de captura, por exemplo:
.catch( error => {
res.status(500).send('Error');
throw new functions.https.HttpsError('invalid-argument', 'Error');
});
Eu não sei como é que eu vou fazer o meu segmento de captura, e eu realmente preciso para obter o erro eu jogar no nó (não apenas "interna").
Funções que podem ser chamadas exigem o seguinte formato:
exports.yourFunction = functions.https.onCall((data, context) => {
// ...
});
Não é a mesma coisa que um HTTP desencadeada Função nuvem , que é o que você está usando. Você ainda pode acessá-lo usando uma solicitação HTTP a partir de seu aplicativo Android, mas se você quer usar mFunctions.getHttpsCallable(function).call(data)
, você vai precisar usar uma função mobilizável Nuvem, que eu ligada acima.