Что мне следует вернуть в вызываемой функции https, если она не ожидает ничего вернуть - PullRequest
5 голосов
/ 05 августа 2020

Я реализовал функцию HTTPs (onCall), которая выдает некоторые ошибки клиенту или возвращает true , если работа успешно завершена. Проблема в том, что я не понимаю, зачем возвращать true (потому что, когда я выдаю ошибки, я не возвращаю false ).

Поскольку протокол HTTP требует возврата ответа на клиент завершил sh запрос, что мне вернуть клиенту? Я подумываю удалить возникающие у меня ошибки и вернуть класс c HTTP-ответ (код состояния, тело, ...).

Есть идеи? Вот что я делаю:

exports.function = functions
  .region("us-central1")
  .runWith({ memory: "2GB", timeoutSeconds: 120 })
  .https.onCall(async (data, context) => {

        // Lazy initialization of the Admin SDK
        if (!is_function_initialized) {
          // ... stuff
          is_uploadImage_initialized = true;
        }
    
        // ... asynchronous stuff
    
        // When all promises has been resolved...
        // If work completed successfully
        return true;
    
       /*
         Is it correct instead ???
         return {code: "200 OK", date: date, body: message };
       */
    
    
       // Else, if errors
       throw new Error("Please, try again later.");
    
       /*
         Is it correct instead ???
         return {code: "418 I'm a teapot", date: date, body: message };
       */

   }

1 Ответ

4 голосов
/ 05 августа 2020

Как объяснено в do c:

Для использования вызываемых функций HTTPS вы должны использовать клиентский SDK для своей платформы вместе с functions.https backend API ( или реализовать протокол )

, что означает, что вы должны следовать протоколу в любом случае , поскольку клиентские SDK реализуют протокол.

Итак, давайте посмотрим, что говорит протокол об ответе, который должен быть отправлен клиенту (то есть вызывающему или потребителю):

Протокол определяет формат тела ответа как следует:

Ответ от конечной точки клиента всегда является объектом JSON . Как минимум, он содержит data или error вместе с любыми дополнительными полями. Если ответ не является объектом JSON или не содержит данных или ошибки, клиентский SDK должен рассматривать запрос как сбойный с кодом ошибки Google ВНУТРЕННИЙ.

error - ....

data - значение, возвращаемое функцией. Это может быть любое допустимое JSON значение . SDK firebase-functions автоматически кодирует значение, возвращаемое пользователем, в этот формат JSON. Клиентские SDK автоматически декодируют эти параметры в собственные типы в соответствии с форматом сериализации, описанным ниже.

Если присутствуют другие поля, их следует игнорировать.

Итак, чтобы ответить на ваш вопрос «что я должен вернуть клиенту?», вы должны вернуть данные, которые могут быть JSON закодированы . См. Также этот раздел протокола do c.

Например, как подробно описано в do c, в вызываемом облаке вы можете сделать

return {
  firstNumber: firstNumber,
  secondNumber: secondNumber,
  operator: '+',
  operationResult: firstNumber + secondNumber,
};
//Excerpt of the doc

или

return {result: "success"}

в своих спецификациях c case («Что мне возвращать в вызываемой функции https, если она не ожидает возврата ничего»), вы вполне можете вернуть следующее, как вы упомянули в своем вопросе:

const date = new Date();
const message = "the message";

return { code: "200 OK", date: date, body: message };

Но вы также может быть return true; или return null; ... Каким-то образом вам решать, что имеет смысл в вашем контексте.

Обратите внимание, что в случае, если вы возвращаете { code: "200 OK", date: date, body: message }, значение code не будет рассматриваться клиентом как код ответа HTTP, поскольку этот объект JSON вставлен в тело ответа.

...