我如何 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()
})