我正在尝试找到编码Firebase云功能的最佳方法。
我的要求包括3个嵌套的http请求。第二个请求是使用第一个请求中的数据发出的。第三个请求来自第二个。
我已经在Typescript中开始了我的项目,但是我在这个答案Cloud Functions for Firebase Async Await style中看到Typescript不支持async / await(我想我想使用它)。
我可以将项目切换回Javascript,也可以按照先前的答案建议使用https://github.com/babel/kneden处的插件进行转换,但是我仍然对如何将其包含在我的打字稿项目中感到困惑(以及如何完成后,编写异步/等待代码。
我在Nested HTTP requests in Firebase cloud function处找到了另一个答案,尽管类似,但使用了诺言链。
我的第一个问题是,我无法决定采用3种方法中的哪一种(以javascript,transpile或使用promises重新开始)。所有这三个似乎都有缺点(如果我能弄清楚如何的话,也许是转码除外)。
以下是我的将Cheerio与request-promise-native和Typescript一起使用的代码。
.each循环中有一些注释的代码,该代码调用第二个函数来发出下一个请求。这是我希望重构以使用更好的方法的代码。
import * as functions from 'firebase-functions';
import * as cheerio from 'cheerio';
import * as moment from 'moment';
import * as http from 'http';
import * as admin from 'firebase-admin';
import * as request from "request-promise-native";
var urlDate = moment().format('YYYYMMDD');
export const getPlayers = functions.https.onRequest((req, response) => {
var options = {
uri: 'https://www.cbssports.com/nba/scoreboard/',
transform: function (body) {
return cheerio.load(body);
}
};
request(options)
.then(($) => {
$('.live-update').each((i, element) => {
var homeTeamAbbr = $(element).find('tbody').children('tr').eq(0).find('a').html().split("alt/").pop().split('.svg')[0];
var awayTeamAbbr = $(element).find('tbody').children('tr').eq(1).find('a').html().split("alt/").pop().split('.svg')[0];
var homeTeam = $(element).find('tbody').children('tr').eq(0).find('a.team').text().trim();
var 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();
var gameTime = $(element).find('.pregame-date').text().trim();
homeTeamStatsURL = homeTeamStatsURL.match(/href="([^"]*)/)[1] + "roster";
awayTeamStatsURL = awayTeamStatsURL.match(/href="([^"]*)/)[1] + "roster";
var matchupString = awayTeamAbbr + "@" + homeTeamAbbr;
var URLString = "NBA_" + urlDate + "_" + matchupString;
// var docRef = database.collection('NBASchedule').doc("UpcommingSchedule");
// var boxScoreURL = "www.cbssports.com/nba/gametracker/boxscore/" + URLString;
// var setAda = docRef.set({[URLString]:{
// homeTeam: homeTeam,
// awayTeam: awayTeam,
// date: gameTime,
// homeTeamAbbr: homeTeamAbbr,
// awayTeamAbbr: awayTeamAbbr,
// homeTeamStatsURL: homeTeamStatsURL,
// awayTeamStatsURL: awayTeamStatsURL,
// boxScoreURL: boxScoreURL
// }}, { merge: true });
// getTeamPlayers(homeTeamStatsURL, matchupString);
// getTeamPlayers(awayTeamStatsURL, matchupString);
console.log("retrieved schedule for "+ matchupString + " on " + urlDate)
});
response.send("retrieved schedule");
})
.catch(function (err) {
console.log("error " + err);
});
});
如果有人可以为我提供最佳解决方案以及如何实施的建议,将不胜感激。 谢谢