HttpsError при вызове API Google Книг из облачной функции Firebase - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь создать облачную функцию Firebase, которая выполняет поиск по API Google Книг.

export const searchBooksOnline = functions.https.onCall(
    async function(data: any, context: functions.https.CallableContext) {
        const query: string = data.query;
        console.log(`Received query loud and clear: ${query}`);
        try {
            const res = await fetch(`https://www.googleapis.com/books/v1/volumes?q=${query}&key=MY-API-KEY`);
            const json = await res.json();
            return json;
        } catch(err) {
            throw new functions.https.HttpsError(err.status, 'Failed to search books online');
        }
    }
);

Но всякий раз, когда я вызываю эту функцию из Javascript API, я получаю сообщение об ошибке:

Unhandled error Error: Unknown error code: undefined.
    at new HttpsError (/srv/node_modules/firebase-functions/lib/providers/https.js:95:19)
    at exports.searchBooksOnline (/srv/lib/books.js:42:15)
    at func (/srv/node_modules/firebase-functions/lib/providers/https.js:267:32)
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7)

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

  • Я вижу свою распечатку в журнале облачных функций "Получен запрос громко и ясно:".

  • Когда я удаляю строку await fetch и возвращаю некоторые фиктивные данные, функция выполняется правильно.

Кроме того, я уверен, что вызов API работает, потому что когда я копирую эти несколько строк для запуска непосредственно из консоли разработчика моего браузера, я получаю ожидаемый ответ API.

Я не уверен, что отличается от среды Cloud Functions, которая вызывая эту ошибку. (Я нахожусь в плане Blaze, который должен позволять мне делать запросы к внешним сайтам)

Надеюсь, что кто-то может помочь пролить некоторый свет на это!

(я видел эта похожая проблема , но решение, примененное OP, не имеет значения для меня, у меня все еще та же ошибка.)

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Сбой вызова API, и вы не используете functions.https.HttpsError правильно. Согласно связанной документации API, первым аргументом конструктора должен быть объект типа FunctionsErrorCode , который должен быть одной из следующих строк:

"ok" | "отменено" | "неизвестный" | "неверный аргумент" | "крайний срок превышен" | "не найден" | "уже существует" | "разрешение отказано" | "истощенный ресурс" | "провал-предварительное условие" | "прервано" | "вне диапазона" | "невыполненный" | "внутренний" | "недоступен" | «потеря данных» | "unauthenticated"

Эти строки возвращают каждую карту обратно в код состояния HTTP, поэтому вам придется решить, что вы на самом деле говорите клиенту. Возможно, вам нужен «внутренний», если вы просто хотите указать на сбой, который невозможно устранить.

0 голосов
/ 07 марта 2020

Ответ от Дуга Стивенсона не решил проблему напрямую, но помог мне диагностировать ее:

Как только я исправил свой отчет HttpsError, как он предложил, я попытался позвонить функция снова и на этот раз она выдала мне сообщение об ошибке 'fetch' not defined. Оказывается , что fetch, который я успешно тестировал со стороны клиента JavaScript, изначально не реализован в NodeJS (который используют функции облака).

Так что исправление было просто использовать другой метод для моего запроса API. В моем случае я решил использовать node-fetch , который реализует тот же интерфейс, что и функция JavaScript fetch.

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

npm install node-fetch @types/node-fetch # the @types package needed for TypeScript

, а затем

import fetch from 'node-fetch';

в верхней части моего кода.

...