在Firebase云函数中,可以安全地异步更新文档而无需等待即可返回吗?
P粉043432210
2023-08-17 14:53:58
<p>在我的Firebase Cloud Function文件中,我有以下的本地函数,它在返回一些属性之前执行了一个文档获取和更新操作。</p>
<pre class="brush:php;toolbar:false;">async function getRandomDocLessThanOperator(seed) {
try {
const db = admin.firestore();
const snapshot = await db.collection("users").where("random", "<=", seed)
.limit(1)
.get();
if (snapshot.empty) {
return null; // 调用者然后尝试大于操作符
}
const doc = snapshot.docs[0];
doc.ref.update({"random": seed}); // 使用新的种子更新
return doc.get("uid");
} catch (error) {
throw new Error(error);
}
}</pre>
<p>这个函数工作正常,但我担心在返回之前尝试异步更新文档。然而,在测试中,文档从未没有更新过。但是,这个函数在更新完成之前是否有可能超时?</p>
<p>无论如何,为了解决这个问题,我尝试使用<code>await</code>来等待更新:</p>
<pre class="brush:php;toolbar:false;">const doc = snapshot.docs[0];
await doc.ref.update({"random": seed});
return doc.get("uid");</pre>
<p>然而,当我这样做时,函数返回了预期的字符串,但没有更新文档。</p>
<ol>
<li>为什么在更新操作前加上<code>await</code>会阻止更新?</li>
<li>不等待更新并像第一个示例中那样异步执行是否安全?</li>
</ol><p><br /></p>
不清楚为什么您的更新没有起作用(也许您可以使用更多的日志记录来清楚地了解运行时发生了什么)。但是我可以肯定地说,在使用Cloud Functions时,您必须返回一个在所有异步工作完成后解决的承诺(或者等待遇到的每个承诺),否则函数可能在工作完成之前被关闭。这是开发人员常犯的错误。
不,这是不“安全”的,因为您无法保证异步代码在函数终止后是否会继续运行。您必须返回一个只在所有异步工作完成后解决的承诺。
请阅读有关此的文档。