Firebase Google Cloud Функция вызова внешней конечной точки - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь использовать облачную функцию Google, которая вызывает внешний API. Я нахожусь на плане Blaze, поэтому я должен быть в состоянии сделать внешние вызовы. У меня есть приложение Express и эти тестовые маршруты:

app.get('/helloWorld', (request, response) => {
    response.send('Hello there');
});

app.get('/test', (request, response) => {
    request.get("https://postman-echo.com/get?foo1=bar1&foo2=bar2", (error, res, body) => {
        console.log('error:', error);
        console.log('statusCode:', res && res.statusCode);
        console.log('body:', body);
        if(error) {
            response.status(400).send(error);
        }
        response.status(200).send(body);
    });
});

Маршрут / helloWorld работает нормально, но / тестовый маршрут истекает каждый раз. Если я посмотрю журналы Firebase для функции, я вижу:

9:19:29.837 PM
api
Function execution started
9:20:29.839 PM
api
Function execution took 60002 ms, finished with status: 'timeout'
9:21:09.263 PM
api
Function execution started
9:21:09.277 PM
api
Function execution took 14 ms, finished with status code: 200
9:21:13.515 PM
api
Function execution started
9:22:13.516 PM
api
Function execution took 60002 ms, finished with status: 'timeout'

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

1 Ответ

1 голос
/ 23 мая 2019

Поскольку вы вызываете сторонний асинхронный API, вы должны сообщить Cloud Functions, когда ваш код готов.Вы делаете это, возвращая обещание из функции, а затем проверяете, что обещание разрешается, когда вся (асинхронная) работа выполнена.

app.get('/test', (request, response) => {
    return new Promise((resolve, reject) {
        request.get("https://postman-echo.com/get?foo1=bar1&foo2=bar2", (error, res, body) => {
            console.log('error:', error);
            console.log('statusCode:', res && res.statusCode);
            console.log('body:', body);
            if(error) {
                response.status(400).send(error);
                reject(error);
            }
            response.status(200).send(body);
            resolve();
        });
    });
});

Возможно, вы захотите использовать библиотеку типа request-promise, чтобы предотвратитьпотребность в собственной логике Promise.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...