#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.
Поэтому вы должны вызвать его с аргументом, даже если вам не нужно ни для чего использовать аргумент.