Firebase Cloud Function如何正确返回布尔值且符合Promise要求?
Firebase可调用函数返回布尔值的正确方式
问题
Firebase Cloud Function最终必须返回Promise。当使用可调用函数,且客户端希望获取布尔值时,我们应返回已解析为该布尔值的Promise,还是可以直接返回布尔值?
原代码示例
exports.doesUserExistAtPhoneNumber = onCall(async (request) => { const phoneNumber = request.data.phoneNumber; try { const db = getFirestore(); const snapshot = await db.collection("userAccounts").where("phoneNumber", "==", phoneNumber).get(); if (snapshot.empty) { // 当前手机号无关联用户 return Promise.resolve(false); } else { // 当前手机号已存在关联用户 return Promise.resolve(true); } } catch (error) { throw new HttpsError("unknown", error); } });
解答
直接返回布尔值就行,没必要用Promise.resolve()包装。
因为你的函数是async函数,所有async函数的返回值都会被自动包装成已解析的Promise。比如写return false;,和写return Promise.resolve(false);的效果完全一样,async函数会帮你完成这个包装步骤。
你可以把代码简化成这样:
exports.doesUserExistAtPhoneNumber = onCall(async (request) => { const phoneNumber = request.data.phoneNumber; try { const db = getFirestore(); const snapshot = await db.collection("userAccounts").where("phoneNumber", "==", phoneNumber).get(); // 直接返回布尔值,async函数自动转为Promise return !snapshot.empty; } catch (error) { throw new HttpsError("unknown", error); } });
这样写更简洁清晰,和原代码的功能完全一致,Firebase可调用函数会正确处理这个返回值,客户端最终拿到的就是解析后的布尔结果。
内容的提问来源于stack exchange,提问作者lurning too koad
相关产品推荐
相关产品推荐

