我有一个
Node.js
应用程序,我可以在其中调用 Firebase 数据库。在我的代码中的某些点,我像这样批量提交数据库写入:
batch.commit();
在某个时刻,这条线开始悬垂。我在它周围添加了一些调试代码,如下所示:
incrementLineNumbersAt(lineNum) {
...
try {
const p = batch.commit();
console.log('got promise');
return p;
} catch(err) {
console.log(`An error occurred: ${err});
}
}
...它打印出“得到承诺”,所以我认为它返回了承诺。然而调用这个函数的承诺链,看起来像这样:
incrementLineNumbersAt(lineNumParsed).then(() => {
console.log('Line numbers incremented');
...
}).catch(err) => {
console.log(`err = ${err}`);
res.status(500).send('Something went wrong when attempting to add content.');
})
...在 then 块或 catch 块中没有打印任何内容,前端也没有收到响应。这就是我所说的“悬挂”。
在尝试调试此代码时,我达到了 Firebase 配额并收到以下错误消息(在尝试执行与上述不同的操作时):
{"code":8,"details":"超出配额。","metadata":{"x-debug-tracking-id":["7944564146387179486;o=1"]}}
这告诉我,可能发生的情况是,当
batch.commit()
尝试更新几条记录(数千条)时,它达到了配额,然后回滚。回滚解释了为什么数据库中没有更新记录,以及为什么我可以继续对数据库进行读取和写入而不会立即超出我的配额。
这就是
batch.commit()
的工作原理吗?它是否尝试在事务中提交批次并在达到配额时回滚?如果是这样,我怎么知道?它会抛出错误吗?为什么我无法捕获错误?
谢谢!
当您收到以下错误时:
{"code":8,"details":"超出配额。","metadata":{"x-debug-tracking-id":["7944564146387179486;o=1"]}}
这意味着您超出了每日配额。如果您使用 Spark Plan(免费计划),则每天最多可以执行 20,000 次写入。如果您达到每日配额,写入将开始失败,正如您已经注意到的那样。
请记住,Firebase 配额每天都会在午夜(太平洋时间)重置。但是,您的时区也可能有所不同。例如,如果您位于欧洲,则可能是在中午。因此,如果您达到每日限制,您需要等到“下一天”,或者您可以更新Blaze Plan,以消除此类错误。
这告诉我,可能发生的情况是,当
尝试更新几条记录(数千条)时,它达到了配额,然后回滚。
batch.commit()
是的,这可能是最有可能发生的情况。
回滚解释了为什么数据库中没有记录更新,以及为什么我可以继续对数据库进行读取和写入而不会立即超出我的配额。
在这种情况下,确实会发生这样的情况。
这就是
的工作原理吗?它是否尝试在事务中提交批次并在达到配额时回滚?
batch.commit()
是的,这就是它的工作原理。当您作为单个批次执行多个写入操作时,批次中的每个操作都会单独计入您的 Cloud Firestore 使用量。例如,如果批次中的第十个操作导致达到每日最大限制,则整个操作将失败。这意味着要么所有操作成功,要么所有操作失败。
它会抛出错误吗?
是的,当您达到每日限制时,会抛出一个错误,其中包含您的问题中存在的确切消息。