我如何 return 来自 batch.commit() Firebase 计划函数的承诺
How do I return a promise from batch.commit() scheduled function in Firebase
这是我第一次在 Firebase 中编写计划函数。我正在尝试从第三方 API 读取体育数据并将该数据放入 Firestore。我首先将该函数构建为常规云函数,验证它使用批处理写入数据库,然后尝试转换为我希望每 2 小时 运行 的计划函数。不幸的是,数据没有写入 Firestore,我也收到以下错误:函数返回未定义、预期的 Promise 或值。
exports.getTodaysNCAABGames = functions.pubsub.schedule('every 2 hours').onRun((context) => {
const options = {
method: 'GET',
url: 'https://sportspage-feeds.p.rapidapi.com/games',
qs: {status: 'in progress', odds: 'any', league: 'NCAAB'},
headers: {
'x-rapidapi-key': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'x-rapidapi-host': 'sportspage-feeds.p.rapidapi.com',
useQueryString: true
}
};
requesting(options, function (error, res, body) {
if (error) throw new Error(error);
const batch = db.batch();
const bodyParsed = JSON.parse(body);
const essentialResultsData = getNCAABEventData(bodyParsed.results);
const ncaaRef = db.collection('ncaab');
essentialResultsData.forEach(result => {
batch.create(ncaaRef.doc(result.gameId), result);
});
return batch.commit();
});
});
function getNCAABEventData(results) {
const essentialEventData = [];
results.forEach((result) => {
const gameId = result.gameId.toString();
const status = result.status;
const oddsObject = result.odds;
const scoreboard = result.scoreboard;
const teams = result.teams;
const resultData = {
gameId: gameId,
status: status,
odds: oddsObject,
scoreboard: scoreboard,
teams: teams
};
essentialEventData.push(resultData);
});
return essentialEventData;
}
我猜 batch.create
returns 是一个承诺,但我认为 return batch.commit()
,我会返回与每个 batch.create 调用相关的所有承诺。
我感觉很接近,但我只是缺少一些非常简单的东西。我们将不胜感激任何帮助!
您的 return batch.commit()
做了 return 一个承诺,但它没有 return 来自整个函数顶层的承诺。它是从您传递给 requesting
的回调函数内部 returning 承诺。这不会传播到顶级函数之外。
我建议研究 requesting
的替代方案,让您使用承诺而不是回调。一个流行的选择是 axios。无论您使用什么,它都应该 return 对查询结果的承诺,并让您以如下形式链接结果:
return request(...)
.then(result => {
// work with the result to add data to Firestore
return batch.commit()
})
这是我第一次在 Firebase 中编写计划函数。我正在尝试从第三方 API 读取体育数据并将该数据放入 Firestore。我首先将该函数构建为常规云函数,验证它使用批处理写入数据库,然后尝试转换为我希望每 2 小时 运行 的计划函数。不幸的是,数据没有写入 Firestore,我也收到以下错误:函数返回未定义、预期的 Promise 或值。
exports.getTodaysNCAABGames = functions.pubsub.schedule('every 2 hours').onRun((context) => {
const options = {
method: 'GET',
url: 'https://sportspage-feeds.p.rapidapi.com/games',
qs: {status: 'in progress', odds: 'any', league: 'NCAAB'},
headers: {
'x-rapidapi-key': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'x-rapidapi-host': 'sportspage-feeds.p.rapidapi.com',
useQueryString: true
}
};
requesting(options, function (error, res, body) {
if (error) throw new Error(error);
const batch = db.batch();
const bodyParsed = JSON.parse(body);
const essentialResultsData = getNCAABEventData(bodyParsed.results);
const ncaaRef = db.collection('ncaab');
essentialResultsData.forEach(result => {
batch.create(ncaaRef.doc(result.gameId), result);
});
return batch.commit();
});
});
function getNCAABEventData(results) {
const essentialEventData = [];
results.forEach((result) => {
const gameId = result.gameId.toString();
const status = result.status;
const oddsObject = result.odds;
const scoreboard = result.scoreboard;
const teams = result.teams;
const resultData = {
gameId: gameId,
status: status,
odds: oddsObject,
scoreboard: scoreboard,
teams: teams
};
essentialEventData.push(resultData);
});
return essentialEventData;
}
我猜 batch.create
returns 是一个承诺,但我认为 return batch.commit()
,我会返回与每个 batch.create 调用相关的所有承诺。
我感觉很接近,但我只是缺少一些非常简单的东西。我们将不胜感激任何帮助!
您的 return batch.commit()
做了 return 一个承诺,但它没有 return 来自整个函数顶层的承诺。它是从您传递给 requesting
的回调函数内部 returning 承诺。这不会传播到顶级函数之外。
我建议研究 requesting
的替代方案,让您使用承诺而不是回调。一个流行的选择是 axios。无论您使用什么,它都应该 return 对查询结果的承诺,并让您以如下形式链接结果:
return request(...)
.then(result => {
// work with the result to add data to Firestore
return batch.commit()
})