Результат вызываемой в Firebase функции всегда равен нулю в клиенте, несмотря на успешное выполнение - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь выполнить функцию Callable с Android.

  1. Выполнение функций В консоли на консоли показано, что вызовы получены и выполнены без ошибок.
  2. Вызываемая задача в клиенте получаетрезультат после выполнения функции, об исключении не сообщается.
  3. Однако полученный результат равен нулю.

Вот код функции-

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);
  });
});

Вотжурнал консоли - enter image description here

Как вы увидите, перед возвратом обещания с переведенным текстом оно было успешно зарегистрировано на консоли.Я также проверил, вернув переведенный текст вместо обещания.В клиенте по-прежнему ноль.

А вот код клиента -

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;
                }
            });
}

Результат вызываемого обратного вызова всегда равен нулю.

Любая идея, как получить реальный ответ

1 Ответ

0 голосов
/ 08 июня 2018

Я нашел решение, виновата моя наивность в Javascript.

Похоже, только если я использую два оператора возврата, тогда фактическая строка отправляется обратно клиенту.Отсутствует ключевое слово 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);
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...