Облачные функции Firebase: «статус»:»НЕДЕЙСТВИТЕЛЬНЫЙ аргумент»

#javascript #firebase #google-cloud-functions #firebase-cli

Вопрос:

Я локально тестирую облачную функцию Firebase. Когда я вызываю эту функцию, используя локальный URL http://localhost:5001/projectName/us-central1/functionName -адрес, как описано здесь:

 exports.createSession = functions.https.onRequest((_req, res) => {
  res.status(200).send('TESTING');
});
 

функция работает и возвращает строку.

Однако, когда я вызываю эту функцию:

 exports.createSession = functions.https.onCall((data, context) => {
  return 'TESTING';
});
 

Это приводит к ошибке: {"error":{"message":"Bad Request","status":"INVALID_ARGUMENT"}}

Я хотел бы использовать последнюю функцию, потому что я хочу получить доступ к context.auth объекту для проверки подлинности пользователя Firebase.

Я использую Firebase CLI v8.4 и узел v10.20.

Чего мне не хватает во второй функции, чтобы заставить ее работать? Я не называю это никакими аргументами, так как мне это не нужно.

Ответ №1:

Вы сравниваете вызываемую функцию onCall с использованием функции HTTP onRequest . Вызываемые функции реализуются совсем иначе, чем функции HTTP. Я предлагаю прочитать документацию, которую я связал, чтобы лучше понять разницу. Главное, что вызываемые функции следуют определенному протоколу, и что любой клиентский доступ должен следовать этому протоколу или, возможно, получить ошибку, которую вы показываете здесь. Лучшей реализацией этого протокола является клиентский SDK, предоставляемый Firebase, — вы должны использовать его для вызова функции.

Если вы хотите, чтобы обычная функция HTTP вызывалась с использованием обычных библиотек HTTP, то вообще не используйте вызываемую функцию. Вы можете передать информацию об аутентификации функции HTTP вручную, используя маркер идентификатора, а затем проверить ее с помощью пакета SDK администратора Firebase. В ссылке на документацию приведены примеры.

Ответ №2:

Ответ заключается в том, что вы не можете вызвать .onCall метод так же, как вы можете onRequest вызвать метод, вы должны вызвать его из SDK. Если data аргумент отсутствует, это приведет к ошибке:

Если вызывается клиентский триггер, но запрос выполнен в неправильном формате, например, не является JSON, имеет недопустимые поля или отсутствует поле данных, запрос отклоняется с ошибочным запросом 400, с кодом ошибки INVALID_ARGUMENT.

Поэтому вы должны вызвать его с аргументом, даже если вам не нужно ни для чего использовать аргумент.