'http request does not get called when uploading the data to Firebase - firebase cloud function

Hello everyone I am trying to fetch the data from Binance than do a schedule function that uploads the data from the previous fetch to the Cloud FireStore , the schedule function is a function that gets called every minute and MUST call the fetch function update the object that contain the data and than I parse that object in order to upload the updated data.

The problem is that the function that fetches the data gets called just one time and that is it, the next minute after the function deploy the fetch data gets not called and I tried everything I found on stackoverflow and google but not luck.

Can anyone give me a hint thank you.

Code:

"use strict";
Object.defineProperty(exports, "__esModule", {value: true});
const functions = require("firebase-functions");
const admin = require("firebase-admin");
const https = require("https");
admin.initializeApp();
const database = admin.firestore();
let finalData = [];
const page = 1;
const fiat = "RON";
const tradeType = "SELL";
const asset = "USDT";
const payTypes = ["BCRBank"];
const baseObj = {
  page,
  rows: 20,
  publisherType: null,
  asset,
  tradeType,
  fiat,
  payTypes,
};
const stringData = JSON.stringify(baseObj);
const options = {
  hostname: "p2p.binance.com",
  port: 443,
  path: "/bapi/c2c/v2/friendly/c2c/adv/search",
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Content-Length": stringData.length,
  },
};

finalData = [];
const req = https.request(options, (res) => {
  console.log("Entered the request call");
  let output = "";
  res.on("data", (d) => {
    output += d;
  });
  res.on("end", () => {
    try {
      const jsonOuput = JSON.parse(output);
      const allData = jsonOuput["data"];
      for (let i = 0; i < allData.length; i++) {
        let payTypesz = "";
        for (let y = 0; y < allData[i]["adv"]["tradeMethods"].length; y++) {
          payTypesz += allData[i]["adv"]["tradeMethods"][y]["payType"];
          if (y < allData[i]["adv"]["tradeMethods"].length - 1) {
            payTypesz += ", ";
          }
        }
        const obj = {
          tradeType: allData[i]["adv"]["tradeType"],
          asset: allData[i]["adv"]["asset"],
          fiatUnit: allData[i]["adv"]["fiatUnit"],
          price: allData[i]["adv"]["price"],
          surplusAmount: allData[i]["adv"]["surplusAmount"],
          maxSingleTransAmount: allData[i]["adv"]["maxSingleTransAmount"],
          minSingleTransAmount: allData[i]["adv"]["minSingleTransAmount"],
          nickName: allData[i]["advertiser"]["nickName"],
          monthOrderCount: allData[i]["advertiser"]["monthOrderCount"],
          monthFinishRate: allData[i]["advertiser"]["monthFinishRate"],
          advConfirmTime: allData[i]["advertiser"]["advConfirmTime"],
          payTypes: payTypesz,
          position: 0,
        };
        finalData.push(obj);
      }
      console.log(finalData);
    } catch (e) {
      console.log(e);
    }
  });
});

const fD =function fetchData(stringData) {
  console.log("I entered the FetchData");
  req.write(stringData);
};

exports.scheduledFunction = functions.pubsub
    .schedule("* * * * *")
    .onRun(async (context) => {
      console.log("I am doing it");
      fD(stringData);
      for (let i = 0; i < finalData.length; i++) {
        console.log("I did not entered here");
        console.log(finalData[i]["price"]);
        await database.collection("SebiBinanceSale").doc("BCR Bank")
            .collection("1").doc(i.toString())
            .set({
              "tradeType": finalData[i]["tradeType"],
              "asset": finalData[i]["asset"],
              "fiatUnit": finalData[i]["fiatUnit"],
              "price": finalData[i]["price"],
              "surplusAmount": finalData[i]["surplusAmount"],
              "maxSingleTransAmount": finalData[i]["maxSingleTransAmount"],
              "minSingleTransAmount": finalData[i]["minSingleTransAmount"],
              "nickName": finalData[i]["nickName"],
              "monthOrderCount": finalData[i]["monthOrderCount"],
              "monthFinishRate": finalData[i]["monthFinishRate"],
              "advConfirmTime": finalData[i]["advConfirmTime"],
              "payTypes": finalData[i]["payTypes"],
              "position": finalData[i]["position"],
            });
      }
      return console.log("Succes Upload of the data ");
    });


Solution 1:[1]

You're missing some of the magic incantation here:

const req = https.request(options, (res) => {

According to the Firebase documentation on HTTP functions that should be:

exports.date = functions.https.onRequest((req, res) => {

Solution 2:[2]

In order to make the function work and callable every minute you have to use the promise otherwise it won't work. Once I start using the promise it star working right away.

code below :

const fD = function fetchData(stringData) {
  return new Promise((res) => {
    console.log("I entered the FetchData");
    req.write(stringData);
    console.log(res);
  });
};

Solution 3:[3]

https://www.tutorialspoint.com/unix_commands/crontab.htm https://firebase.google.com/docs/functions/schedule-functions

Based on the doc, this line .schedule("* * * * *") should probably be .schedule("1 * * * *") if you want it to run every minute.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Frank van Puffelen
Solution 2 Alex97
Solution 3 xanderjakeq