Просматривая документы, я обнаружил:

... вы можете вызывать функции напрямую с помощью HTTP-запроса или вызова от клиента.

~ источник

там (ссылка в цитате) - это упоминание о функциях. Https.onCall.

Но в учебнике , здесь, используется другая функция functions.https.onRequest, так какую из них использовать и почему? В чем разница / сходство между ними?

Документация по функциям . Https это здесь.

Ответы (2)

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

  • Оба типапри развертывании назначаются с уникальным URL-адресом конечной точки HTTPS и могут быть доступны напрямую.

звонок

  • Может быть вызван (и это тоже основная цель) непосредственно из клиентского приложения.

    functions.httpsCallable ('getUser') ({uid})
      .then (r => console.log (r.data.email))
    
  • Реализуется с предоставленными пользователем данными и автоматическим контекстом.

    экспорт const getUser = functions.https.onCall ((data, context) => {
      if (! context.auth) return {status: 'error', code: 401, message: 'Not signed in'}
      вернуть новое обещание ((разрешить, отклонить) => {
        // находим пользователя по data.uid и возвращаем результат
        решить (пользователь)
      })
    })
    
  • Контекст автоматически содержит метаданные о запросе, такие как uid и токен.
  • Входные данные и ответ объекты автоматически (де) сериализуются.

onRequest

  • Firebase onRequest Docs
  • Служит в основном как конечная точка Express API.
  • Реализовано с помощью объектов express Request и Response.

    экспорт const getUser = functions.https.onRequest ((req, res) => {
      // проверяем пользователя из req.headers.authorization и т. д.
      res.status (401) .send ('Требуется аутентификация.')
      // если авторизовано
      res.setHeader ('Content-Type', 'приложение / json')
      res.send (JSON.stringify (пользователь))
    })
    
  • Зависит от заголовков авторизации, предоставленных пользователем.
  • Вы несете ответственность за ввод и ответные данные.

Подробнее здесь Улучшен ли триггер https.onCall для новых облачных функций Firebase?

Основное различие между onCall и onRequest для клиента - это способ их вызова. когда вы определяете функцию, используя onCall, например,

exports.addMessage = functions.https.onCall((data, context) => {
  // ...
});

вы вызываете на нем клиентскую сторону с помощью клиентского SDK функции firebase, например,

// on the client side, you need to import functions client lib
// then you invoke it like this:
const addMessage = firebase.functions().httpsCallable('addMessage');
addMessage({ text: messageText })
  .then((result) => {
    // Read result of the Cloud Function.        
  });

подробнее для onCall: https://firebase.google.com/docs/functions/callable

Но если вы определяете свою функцию с помощью onRequest, например,

exports.addMesssage = functions.https.onRequest((req, res) { ... res.send(...); }

вы можете вызвать его, используя обычный JS fetch API (нет необходимости импортировать клиентскую библиотеку функций firebase на стороне клиента), например,

fetch('/addMessage').then(...)

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

подробнее для onRequest: https://firebase.google.com/docs/functions/http-events

2022 WebDevInsider