Завершение функции http в Firebase до того, как библиотека запросов http вернет данные - PullRequest
0 голосов
/ 28 июня 2018

У меня есть функция Firebase, запускаемая по HTTP, которая использует библиотеку запросов https://github.com/request/request для отправки HTTP-сообщения другому API. Журналы показывают, что запрос POST возвращает правильные данные, но функция Firebase завершает работу, прежде чем Async POST вернет данные. Как заставить всю функцию ждать POST-запрос?

const functions = require('firebase-functions');
var requestDependency = require('request');

exports.XXXXXXXXXX = functions.https.onRequest((request, response) => {

    var answer = 'testo';
    var jsonResponse = null;
    var jsonData = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
    let url = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; //or production  

    requestDependency.post({

        headers: {    
            'content-type': 'XXXXXXXXXXXXXXXXXXXX'  ,
            'Accept': 'XXXXXXXXXXXXXXXXXXXX',
            'XXXXXXXXXX-Access-Token': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
        },

        url: url,  
        body: jsonData 

    }, function(error, response, body) { 

        if (error) {  
            console.log('errrrrrrrror1')
        } else {
            jsonResponse = body;
            console.log(jsonResponse); <-----Shows correct data returned
            console.log('Done.');
            answer = jsonResponse;
            console.log('TEST: ' + answer)
        }
    });

    console.log("Performing search");
    response.send(cardName+" "+jsonResponse); <---jsonResponse not populated
});

1 Ответ

0 голосов
/ 28 июня 2018

Согласно документации , HTTP-функции прекращаются при отправке ответа клиенту. Это означает, что ваш вызов response.send () фактически завершает функцию.

Проблема в том, что вызов post() является асинхронным и немедленно возвращается, пока HTTP-запрос продолжается в фоновом режиме. Выполнение функции продолжается сразу после публикации. Это означает, что отправленный вами ответ почти наверняка будет выполнен до того, как закончится HTTP-запрос.

Если вы хотите дождаться завершения HTTP-запроса, поместите свой ответ клиенту внутри обратного вызова, который обрабатывает ответ от HTTP-запроса.

function(error, response, body) { 
    if (error) {  
        console.log('errrrrrrrror1')
        // send an error response here
    } else {
        jsonResponse = body;
        console.log(jsonResponse); <-----Shows correct data returned
        console.log('Done.');
        answer = jsonResponse;
        console.log('TEST: ' + answer)
        // send an success response here
    }
});

Также посмотрите этот видеофильм, чтобы лучше понять, как работают Облачные функции: https://www.youtube.com/watch?v=7IkUgCLr5oA&index=2&list=PLl-K7zZEsYLkPZHe41m4jfAxUi0JjLgSM

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