【发布时间】:2020-05-14 05:10:12
【问题描述】:
我正在尝试将 Firebase 数据库数据与 Google 电子表格同步。为此,我有两种方法在数据库中以特定路径运行 onCreate 和 onUpdate。问题是有时 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