簡體   English   中英

Firebase 雲端 function 上傳數據到雲端 firebase 無故刪除數據

[英]Firebase cloud function uploading data to the cloud firebase deletes the data without any reason

你好,所以有點背景。 我在 JS 中創建了一個 function,它從網站每分鍾都會處理該數據,然后將其發送到雲 firestore。 問題是在上傳數據后,文檔和集合被無緣無故地刪除,我不明白發生了什么。

我嘗試在線搜索,但找不到修復程序。

誰能告訴我發生了什么事?

這是JS中的function

import functions = require("firebase-functions");
import admin = require("firebase-admin");
admin.initializeApp();
const database = admin.firestore();
import https = require("https");
let finalData: { [x: string]: any; }[] = [];
const page = 1;
const fiat = "";
const tradeType = "";
const asset = "";
const payTypes = [""];
const baseObj = {
  page,
  rows: ,
  publisherType: ,
  asset,
  tradeType,
  fiat,
  payTypes,
};
const stringData = JSON.stringify(baseObj);
const options = {
  hostname: "",
  port: ,
  path: "",
  method: "",
  headers: {
    "Content-Type": "application/json",
    "Content-Length": stringData.length,
  },
};


const req = https.request(options, (res: any) => {
  finalData = [];
  let output = "";
  res.on("data", (d: string) => {
    output += d;
  });
  res.on("end", () => {
    try {
      const jsonOuput = JSON.parse(output);
      const allData = jsonOuput["data"];
      for (let i = 0; i < allData.length; i++) {
        let payTypesz = "";
        for (let y = 0; y < allData[i]["adv"]["tradeMethods"].length; y++) {
          payTypesz += allData[i]["adv"]["tradeMethods"][y]["payType"];
          if (y < allData[i]["adv"]["tradeMethods"].length - 1) {
            payTypesz += ", ";
          }
        }
        const obj = {
          tradeType: allData[i]["adv"]["tradeType"],
          asset: allData[i]["adv"]["asset"],
          fiatUnit: allData[i]["adv"]["fiatUnit"],
          price: allData[i]["adv"]["price"],
          surplusAmount: allData[i]["adv"]["surplusAmount"],
          maxSingleTransAmount: allData[i]["adv"]["maxSingleTransAmount"],
          minSingleTransAmount: allData[i]["adv"]["minSingleTransAmount"],
          nickName: allData[i]["advertiser"]["nickName"],
          monthOrderCount: allData[i]["advertiser"]["monthOrderCount"],
          monthFinishRate: allData[i]["advertiser"]["monthFinishRate"],
          advConfirmTime: allData[i]["advertiser"]["advConfirmTime"],
          payTypes: payTypesz,
          position: 0,
        };
        finalData.push(obj);
      }
      console.log(finalData);
    } catch (e) {
      console.log(e);
    }
  });
});
exports.scheduledFunction = functions.pubsub
    .schedule("* * * * *")
    .onRun((context: any) => {
      req.write(stringData);
      req.end();
      for (let i = 0; i < finalData.length; i++) {
        database.doc("/$i")
            .set({
              "tradeType": finalData[i]["tradeType"],
              "asset": finalData[i]["asset"],
              "fiatUnit": finalData[i]["fiatUnit"],
              "price": finalData[i]["price"],
              "surplusAmount": finalData[i]["surplusAmount"],
              "maxSingleTransAmount": finalData[i]["maxSingleTransAmount"],
              "minSingleTransAmount": finalData[i]["minSingleTransAmount"],
              "nickName": finalData[i]["nickName"],
              "monthOrderCount": finalData[i]["monthOrderCount"],
              "monthFinishRate": finalData[i]["monthFinishRate"],
              "advConfirmTime": finalData[i]["advConfirmTime"],
              "payTypes": finalData[i]["payTypes"],
              "position": finalData[i]["position"],
            });
      }
      return console.log("Succes Upload of the data ");
    });
//  # sourceMappingURL=index.js.map

這是數據庫的設置。 在此處輸入圖像描述

默認情況下https對於 Node.js不返回 Promises ,因此 正確管理雲 Function 的生命周期可能很麻煩。

我建議您使用axios庫並按如下方式重構您的代碼,使用批量寫入寫入 Firestore:

exports.scheduledFunction = functions.pubsub
    .schedule("* * * * *")
    .onRun(async (context: any) => {   // <=== See async keyword here
        
        try {
            const httpCallResponse = await axios.get(...); // I let you adapt the code, including the URL to call, according to the axios doc
            const finalData = ... // Again, it's up to you to work out the value based on httpCallResponse
            
            const batch = database.batch();
    
            for (let i = 0; i < finalData.length; i++) {
                batch.set(database.doc(i.toString(10)),
                    {
                        "tradeType": finalData[i]["tradeType"],
                        "asset": finalData[i]["asset"],
                        "fiatUnit": finalData[i]["fiatUnit"],
                        "price": finalData[i]["price"],
                        "surplusAmount": finalData[i]["surplusAmount"],
                        "maxSingleTransAmount": finalData[i]["maxSingleTransAmount"],
                        "minSingleTransAmount": finalData[i]["minSingleTransAmount"],
                        "nickName": finalData[i]["nickName"],
                        "monthOrderCount": finalData[i]["monthOrderCount"],
                        "monthFinishRate": finalData[i]["monthFinishRate"],
                        "advConfirmTime": finalData[i]["advConfirmTime"],
                        "payTypes": finalData[i]["payTypes"],
                        "position": finalData[i]["position"],
                    });
            }
            
            await batch.commit();
            console.log("Succes Upload of the data ");
            
            return null;
           
        } catch (error) {
            console.log(error);
            return true;
        }

    });

額外注意:請注意,使用您的代碼創建單調遞增的 ID,這可能是一個問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM