Использование Firebase Cloud Functions для извлечения данных из внешнего API (время ожидания) - PullRequest
1 голос
/ 24 сентября 2019

Это мой код:

const functions = require('firebase-functions');
const axios = require('axios');
const cors = require('cors')({ origin: true });

exports.apistatus = functions
.region('europe-west1')
.https.onRequest((req, res) => {

  cors(req, res, () => {
    if (req.method !== "GET") {
      return res.status(401).json({
        message: "Not allowed"
      });
    }

    return axios.get('https://api.bsmsa.eu/ext/api/bsm/gbfs/v2/en/station_status')
      .then(response => {
        console.log(response.data);
        return res.status(200).json(
          response.data
        )
      })
      .catch(err => {
        return res.status(500).json({
          error: err
        })
      })

  })
  // ! res.end();
});

Я уже использую план Blaze, но всегда получаю его, когда вызываю его >> Выполнение функции заняло 60002 мс, завершено со статусом: «timeout».

Если я пытаюсь завершить функцию, как сказано в документации, с помощью res.send () или res.end (), я получаю эту ошибку: Ошибка: невозможно установить заголовки после их отправки.

Работает нормально, когда я пытаюсь получить другие API.

1 Ответ

0 голосов
/ 24 сентября 2019

Вам нужно ключевое слово return перед вызовом функции cors ().

exports.apistatus = functions
.region('europe-west1')
.https.onRequest((req, res) => {

    return cors(req, res, () => {     // <------ RETURN NEEDED HERE
        if (req.method !== "GET") {
            return res.status(401).json({
                message: "Not allowed"
            });
        }

        return axios.get('https://api.bsmsa.eu/ext/api/bsm/gbfs/v2/en/station_status')
            .then(response => {
                console.log(response.data);
                return res.status(200).json(
                    response.data
                )
            })
            .catch(err => {
                return res.status(500).json({
                    error: err
                })
            })

    })
});

Ваш код аксиоса выполняется, и я подозреваю, что он получает ответ, но потому что вы не возвращаетеВ результате CORS «родительская» облачная функция никогда не узнает, что задача выполнена.

В этом примере показан пример из официального Firebase GitHub, где они используют Cors.

...