簡體   English   中英

Cloud Function 在部署時不會保存到 Firestore

[英]Cloud Function does not save to Firestore when deployed

我已經部署了一個雲 function,它加載了一個 API 並將其內容保存到我的 Firestore 數據庫中。 當我使用 firebase 模擬器在本地環境中運行雲 function 時,它運行良好。 但是,當我將相同的 function 部署到 Google Cloud Platform 時,它無法將內容保存到 Firestore,盡管它成功加載了 API。 我的設置中還缺少什么?

這是代碼。 我故意編輯了 API 鏈接。

const functions = require('firebase-functions');
const rp = require('request-promise');
const admin = require('firebase-admin');
const axios = require('axios');

admin.initializeApp({
    credential: admin.credential.applicationDefault()
});

 exports.savePSEData = functions.https.onRequest((req, res) => {
    const url = <LINK REDACTED>;
    return new Promise((resolve, reject) => {

        axios
            .get(url)
            .then(response => {
                const date = response.data.as_of;
                for (var index in response.data.stock) {
                    var stock = response.data.stock[index]
                    createStockDocument(date, stock.symbol, stock.price.amount, stock.percent_change, stock.volume, callback => {
                        console.log(index)
                    })
                }
               return res.status(200).send("ok");
            })
            .catch(error => {
                console.log(error);
               return res.status(500).send(error);
            });
    })

});

function createStockDocument(date, symbol, amount, percentChange, volume, callback) {
    console.log("Creating temp package")
    const docRef = admin.firestore().doc(`${symbol}/${date}`);
    docRef.set({ 
        amount: amount,
        percent_change: percentChange,
        volume: volume
    })
    .then(docRef => {
        console.log('Document created')
        return callback(docRef)
    }).catch(error => {
        console.log(`Error trying to create document ${error}`)
        return callback(error);
    })

}

您的代碼忽略了docRef.set().then(...).catch(...)返回的 promise 。 調用thencatch並沒有完全處理catch只是返回另一個 promise,它在整個鏈解析后異步解析。 這意味着您的 function 也在 Firestore 完成寫入之前向客戶端發送響應,這意味着它可能永遠不會完成。 設置響應后,功能將立即終止。

您應該讓createStockDocument從鏈中返回 promise,然后讓 function 的調用者在發送響應之前等待它。 最低限度:

function createStockDocument(date, symbol, amount, percentChange, volume, callback) {
    console.log("Creating temp package")
    const docRef = admin.firestore().doc(`${symbol}/${date}`);
    return docRef.set(...).then(...)
}

我建議不要在這里使用 catch,而是讓調用者捕捉器出現任何錯誤。

createStockDocument(...)
.then(() => res.status(200).send("ok"))
.catch(error => res.status(500).send(error))

我強烈建議牢牢掌握 promise 的工作原理,因為它們對於在 Cloud Functions 中編寫有效代碼至關重要。

暫無
暫無

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

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