我正在尝试从 android 执行 Callable 函数。
- 功能执行登录控制台显示调用已被接收和执行,没有任何错误。
- client中的可调用任务在函数执行后收到结果,没有异常报告。
- 但是,收到的结果为空。
这是函数代码-
const Translate = require('@google-cloud/translate');
const projectId = functions.config().firebase;
const translate = new Translate({
projectId: projectId,
});
exports.translateMessage = functions.https.onCall((data, context) => {
let text = data.text;
let targetLanguage = data.target_language;
let uid = context.auth.uid;
console.log("incoming text: " + text)
console.log("incoming uid: " + uid)
console.log("incoming target: " + targetLanguage)
//In future, check if uid or custom claim has quota
if(!uid)
return text;
translate
.translate(text, targetLanguage)
.then(results => {
const translation = results[0];
console.log("translated text: " + translation)
return Promise.resolve(translation);
//also tried returning json like: return {translationText: translation};
})
.catch(err => {
console.log(err)
return Promise.reject(err);
});
});
正如您将看到的,就在返回带有翻译文本的 promise 之前,它已成功记录到控制台。我还通过返回翻译文本本身而不是 promise 来进行测试。在客户端仍然为空。
这是客户端代码-
private Task<String> translateMessage(String text, String targetLanguage) {
// Create the arguments to the callable function.
Map<String, Object> data = new HashMap<>();
data.put("text", text);
data.put("target_language", targetLanguage);
FirebaseFunctions mFunctions = FirebaseFunctions.getInstance();
return mFunctions
.getHttpsCallable("translateMessage")
.call(data)
.continueWith(new Continuation<HttpsCallableResult, String>() {
@Override
public String then(@NonNull Task<HttpsCallableResult> task) throws Exception {
String result = (String) task.getResult().getData();
Log.d(TAG, "Result in callable callback: " + result);
return result;
}
});
}
可调用回调的结果始终为空。
知道如何获得实际响应吗?
最佳答案
我找到了一个解决方案,我的 Javascript 天真是罪魁祸首。
看起来只有当我使用两个 return 语句时,实际的字符串才会被发送回客户端。实际 promise 前面的 return 关键字丢失了......
return translate
.translate(text, targetLanguage)
.then(results => {
const translation = results[0];
console.log("translated text: " + translation)
return Promise.resolve(translation);
})
.catch(err => {
console.log(err)
return Promise.reject(err);
});
关于android - 尽管执行成功,Firebase 可调用函数结果在客户端中始终为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50740737/