【问题标题】:How to make sure that the onUpdate method of the firebase database only runs after the onCreate method completes如何确保firebase数据库的onUpdate方法仅在onCreate方法完成后运行
【发布时间】:2020-05-14 05:10:12
【问题描述】:

我正在尝试将 Firebase 数据库数据与 Google 电子表格同步。为此,我有两种方法在数据库中以特定路径运行 onCreateonUpdate。问题是有时 onUpdate 回调调用的方法在 onCreate 回调调用的方法之前执行。 在 onUpdate 方法中做某事之前如何确保 onCreate 方法是完整的? 顺便说一句,这里是代码。也许我得到了一些关于代码的总体建议,因为现在是使用 Firebase 和 JavaScript 函数最困难的时期。

exports.appendrecordtospreadsheet = functions.database.ref(`${CONFIG_DATA_PATH}/{USERID}/{GAMENUMBER}`).onCreate(
        (snap) => {        
            var firstRecord = [];
            console.log(snap.ref.parent.key);
            const key = snap.ref.parent.key;
            firstRecord.unshift(key);
            firstRecord.push(snap.val()[0])
            return appendPromise({
                spreadsheetId: CONFIG_SHEET_ID,
                range: 'A:Z',
                valueInputOption: 'USER_ENTERED',
                insertDataOption: 'INSERT_ROWS',
                resource: {
                    values: [firstRecord],
                },
            });
        });

function appendPromise(requestWithoutAuth)
{
    return new Promise(async (resolve, reject) => 
    {
        const client = await getAuthorizedClient();
        const sheets = google.sheets('v4');
        const request = requestWithoutAuth;
        request.auth = client;
        return sheets.spreadsheets.values.append(request, (err, response) => {
            if (err) {
                console.log(`The API returned an error: ${err}`);
                return reject(err);
            }
            return resolve(response.data);
        });
    });
}

exports.UpdateRecordInSpreadSheet = functions.database.ref(`${CONFIG_DATA_PATH}/{USERID}/{GAMENUMBER}`).onUpdate(
        (change) => {            
            const key = change.after.ref.parent.key;
            const updatedRecord = change.after.val();
            updatedRecord.unshift(key); 
                        return updatePromise({
                            spreadsheetId: CONFIG_SHEET_ID,
                            range: 'A:X',
                            valueInputOption: 'USER_ENTERED',
                            resource: {
                                values: [updatedRecord],
                            },
                        });

        });

function updatePromise(requestWithoutAuth) 
{
    return new Promise(async (resolve, reject) => 
    {
        const client = await getAuthorizedClient();
        const sheets = google.sheets('v4');
        const updateRequest = requestWithoutAuth;
        updateRequest.auth = client;
        const getRequest = {
            spreadsheetId: CONFIG_SHEET_ID,
            range: 'A:A'
        };
        getRequest.auth = client;
        return sheets.spreadsheets.values.get(getRequest, (err, response) => {
            if (err) {
                console.log(`The API returned an error: ${err}`);
                return reject(err);
            }
            else {
                const index = response.data.values[0].lastIndexOf(updateRequest.resource.values[0][0]) + 1;
                updateRequest.range = `A${index}:Z${index}`;
                return sheets.spreadsheets.values.update(updateRequest, (err, response) => {
                    if (err) {
                        console.log(`The API returned an error: ${err}`);
                        return reject(err);
                    }
                    return resolve(response.data);
                });
            }
        });
    });
}

【问题讨论】:

    标签: javascript firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    Cloud Functions 不保证事件的顺序。实际上,可能会同时处理两个事件。您需要在代码中考虑到这一点。通常它需要使用transaction 来确保两个同时运行的代码不会相互冲突。

    对此没有解决方法 - 这正是 Cloud Functions 的工作方式,它确保产品能够在不丢失事件的情况下扩大需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 2021-01-27
      相关资源
      最近更新 更多