Облачная функция Firebase с HTTP-запросом срабатывает иногда, но иногда не работает (Cheerio API) - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь понять, что не так с моим кодом.Прямо сейчас у меня есть функция Cloud Firestore, которая использует запрос-обещание-родной и Cheerio для извлечения некоторых данных с веб-страницы и записи их в мою базу данных firestore.

Странно то, что мой код работает, когда я сначала вручную добавляю документ в базу данных перед выполнением запроса.

 //var setDoc = scheduleRef.add({"hi": "hello world"});

Если эта строка не закомментирована, то она и весь приведенный ниже код будут работать и записывать мои объекты в базу данных в методе Cheerio .each по мере необходимости.

Почему при добавлении документа вручную перед переходом в цикл веб-очистки весь код работает?Почему это не работает иначе?Кто-нибудь может мне это объяснить?

Спасибо,

import * as functions from 'firebase-functions';
import * as cheerio from 'cheerio';
import * as moment from 'moment';
import * as admin from 'firebase-admin';
import * as request from "request-promise-native";

admin.initializeApp(functions.config().firebase);

 const urlDate = moment().format('YYYYMMDD');
 const database = admin.firestore();


export const getnewPlayers = functions.https.onRequest((req, response) => {

const scheduleRef = database.collection('NBASchedule');
//var setDoc = scheduleRef.add({"hi": "hello world"});

const options = {
uri: 'https://www.cbssports.com/nba/scoreboard/',
transform: function (body) {
    return cheerio.load(body);
}
};

request(options)

.then(($) => {

$('.live-update').each( (i, element) => {

        const homeTeamAbbr = $(element).find('tbody').children('tr').eq(0).find('a').html().split("alt/").pop().split('.svg')[0];
        const awayTeamAbbr = $(element).find('tbody').children('tr').eq(1).find('a').html().split("alt/").pop().split('.svg')[0];
        const homeTeam = $(element).find('tbody').children('tr').eq(0).find('a.team').text().trim();
        const awayTeam = $(element).find('tbody').children('tr').eq(1).find('a.team').text().trim();
        var homeTeamStatsURL = $(element).find('tbody').children('tr').eq(0).find('td').html();
        var awayTeamStatsURL = $(element).find('tbody').children('tr').eq(1).find('td').html();
        const gameTime = $(element).find('.pregame-date').text().trim();

        homeTeamStatsURL = homeTeamStatsURL.match(/href="([^"]*)/)[1] + "roster";
        awayTeamStatsURL = awayTeamStatsURL.match(/href="([^"]*)/)[1] + "roster";

        const matchupString = awayTeamAbbr + "@" + homeTeamAbbr;
        const URLString = "NBA_" + urlDate + "_" + matchupString;


        var boxScoreURL = "www.cbssports.com/nba/gametracker/boxscore/" + URLString;


        const setScheule = scheduleRef.doc(URLString).set({
          homeTeam: homeTeam,
          awayTeam: awayTeam,
          date: gameTime,
          homeTeamAbbr: homeTeamAbbr,
          awayTeamAbbr: awayTeamAbbr,
          homeTeamStatsURL: homeTeamStatsURL,
          awayTeamStatsURL: awayTeamStatsURL,
          boxScoreURL: boxScoreURL
        });

        setScheule.then(writeResult => { 
            console.log("retrieved schedule for "+ matchupString + " on " + urlDate);
            return 0;

        });

        //getTeamPlayers(homeTeamStatsURL, matchupString);
       // getTeamPlayers(awayTeamStatsURL, matchupString);

});

 response.send("retrieved schedule");
})
.catch(function (err) {
   console.log("error " + err);
});

});

...