Облачные функции Firebase: ошибка 500, несмотря на успешные результаты - PullRequest
1 голос
/ 23 апреля 2020

Я создаю серверную часть веб-приложения для облачных функций Firebase и состоит из двух функций:

  1. ФУНКЦИЯ WEBSCRAPER, написанная в Python3 с использованием BeautifulSoup, для очистки содержимого с нескольких страниц (легко около 500 страниц) , и возвращает извлеченное содержимое в виде json
  2. SCHEDULED FUNCTION, записанное в Nodejs, которое вызывает еженедельные интервалы в элементе 1 в элементе 1, и обновляет Firestore с очищенным содержимым.

Запланированная функция использует Ax ios для выполнения запросов на получение.

Проблема Я постоянно получаю следующую ошибку в запланированной функции нерегулярно. Это происходит иногда при каждом вызове, а иногда даже не один раз, что затрудняет отладку. Нерегулярности также возникают в средах разработки, промежуточных и промежуточных приложений:

//err.response
{ status: 500,
  statusText: 'Internal Server Error',
  headers: 
   { 'x-cloud-trace-context': '2f22d7fc6a9044dcfc31acafc2d50e54',
     date: 'Thu, 23 Apr 2020 04:45:39 GMT',
     'content-type': 'text/html; charset=UTF-8',
     server: 'Google Frontend',
     'content-length': '323',
     'alt-svc': 'quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,h3-T050=":443"; ma=2592000',
     connection: 'close' },
  config: 
   { url: 'CLOUD_FUNCTIONS_URL',
     method: 'get',
     params: {//params}
}

Когда бы ни возникали такие ошибки в РАСПИСАННОЙ ФУНКЦИИ, в FUNCTION WEBSCRAPER фактически не было ошибок, ie Консоль Firebase Cloud Function печатает Function execution took XXXX ms, finished with status code: 200 для ФУНКЦИИ WEBSCRAPER.

Я также проверил функцию ФУНКЦИИ WEBSCRAPER, чтобы после ее завершения с status code: 200, действительные результаты возвращались правильно .

Часть моего код следующий:

//In the SCHEDULED FUNCTION where I call the WEBSCRAPER FUNCTION
function getContentPromise(param1, param2) {
    let url = //WEBSCRAPER FUNCTION's url
    let parameters = {param1: param1, param2: param2};
    let config = {
        params: parameters,
    }
    return axios.get(url, config)
    .then((response) => {
        return response.data
    })
    .catch((err) => {
        console.log('Retrying...', err.response) //Error thrown here
        return getContentPromise(param1, param2)
    })
}

//In the WEBSCRAPER FUNCTION

//At main.py
def scrape(request):
    response_object = scrape(request)
    return jsonify(response_object)

//At the scrape function
def scrape(request):
    param1 = request.args.get('param1')
    param2 = request.args.get('param2')

    //Some scraping stuff happening here using beautifulsoup

    response_object = {}
    response_object[constants.status_code_key] = 200
    response_object['contents'] = contents //contents in json

    return response_object

1 Ответ

0 голосов
/ 23 апреля 2020

Какой план у вас есть? Исходящие сетевые запросы к сервисам, не принадлежащим Google, разрешены только в Blaze тарифном плане .

. Вы можете убедиться, что это так в вашем приложении, если оно работает в локальной среде, но дает 500 код ответа в производстве.

...