javascript - Hur löser man fel vid distribution av Firebase Cloud Functions?


Jag använder Firebase Cloud Functions.

Det finns en funktion som heter fetchNewsScheduled, den körs varannan timme. Den gör detta:

  1. rensa samlingen med fn clearNewsCollection för att frigöra databasen

  2. Hämta data från API och skicka dem till databasen

Det är allt...

Men misstag händer och jag har ingen aning om varför:

Fel: Det uppstod ett fel vid distributionen av funktioner:

Fel Misslyckades med att uppdatera funktionen fetchNewsScheduled i regionen us-central1

type ArticleType = {
  _type: string;
  name: string;
  url: string;
  image: {
    _type: string;
    thumbnail: {
      _type: string;
      contentUrl: string;
      width: number;
      height: number;
    };
    isLicensed: boolean;
  };
  description: string;
  datePublished: string;
};

type SimplifiedArticleType = {
  name: string;
  url: string;
  imageUrl: string;
  description: string;
  datePublished: string;
};
async function clearNewsCollection() {
  const snapshot = await db.collection("news").get();
  const batch = db.batch();
  snapshot.forEach((doc) => {
    batch.delete(doc.ref);
  });
  await batch.commit();
  console.log(`Deleted ${snapshot.size} documents from`);
}
async function fetchNews() {
  const options = {
    method: "GET",
    url: "https://bing-news-search1.p.rapidapi.com/news",
    params: { safeSearch: "Off", textFormat: "Raw" },
    headers: {
      "X-BingApis-SDK": "true",
      "X-RapidAPI-Key": "my_key",
      "X-RapidAPI-Host": "bing-news-search1.p.rapidapi.com",
    },
  };

  try {
    await clearNewsCollection();

    const response = await axios.request(options);

    const newsArticles = response.data.value; //an array
    const simplifiedArticles = newsArticles.map((article: ArticleType) => {
      return {
        name: article.name,
        url: article.url,
        imageUrl: article.image?.thumbnail?.contentUrl,
        description: article.description,
        datePublished: article.datePublished, //eg. "2023-03-10T14:31:02.0000000Z", moment(datePublished).fromNow();
      };
    });

    const batch = db.batch();

    simplifiedArticles.forEach((article: SimplifiedArticleType) => {
      const docRef = db.collection("news").doc();
      batch.set(docRef, article);
    });
    await batch.commit();

    console.log("Batch write successful");
  } catch (error) {
    console.log("Error writing documents:", error);
  }
}
// Define the Cloud Function to run every 2 hours
export const fetchNewsScheduled = functions.pubsub
  .schedule("every 2 hours")
  .onRun(async (context) => {
    await fetchNews();
    return null;
  });

Lösning:

Jag gjorde några vårdslösa misstag.

Först installerade jag axios i cd my-app.

Det bör vara cd my-app => cd functions => npm install axios.

Då kan löftet från API:et vara null, undefined, etc.

Därför finns det några meddelanden till framtida läsare:

  1. Kontrollera package.json i functions-mappen.
  2. Du kan inte spara ett odefinierat värde i Firebase
const simplifiedArticles = newsArticles.map((article: ArticleType) => {
      return {
        name: article.name || "",
        url: article.url || "",
        imageUrl: article.image?.thumbnail?.contentUrl || "",
        description: article.description || "",
        datePublished: article.datePublished || "", //eg. "2023-03-10T14:31:02.0000000Z", moment(datePublished).fromNow();
      };
    });