首先尽量避免让每个人都可以读取所有用户。这是大多数人在处理此类问题时所做的事情。这样做是因为如果您不授予阅读所有用户的权限,则对所有用户的查询将不起作用。
出于安全原因,我会将检查用户是否存在的逻辑移到可调用函数中(不是 http 函数!)。这样你就可以在你的应用程序内部调用它并检查一个或多个数组中的用户。这将取决于您的前端将如何处理它。
非常重要的是,以绝对相同的格式存储所有电话号码。这样你就可以查询它们。无论用户数量有多少,您总能找到像这里这样的特定用户:
var citiesRef = db.collection("users");
var query = citiesRef.where("Phone","==","+4912345679");
数字必须完全相同,不能有任何空空格 -
字符,+49 或 0049 也必须相同。
您可以创建两个可调用函数。一个用于检查您的应用程序中是否存在单个用户,另一个用于您发送一组电话号码并返回一个数组。云函数可以使用 Promise.all
并行执行此类查询,因此您可以非常快速地获得响应。
我正在使用类似的方法将我的应用程序中的用户添加为特定组的管理员,您只需在其中输入用户的电子邮件,如果他在应用程序中,他就会被添加。我不是他在电子邮件中收到了加入应用程序的邀请。
,
在 Tarik 的回答的帮助下,Ayrix 和我想出了以下解决方案。
重要提示:阅读 Tarik 的回答以了解更多信息。
客户: callable_compare_contacts.dart
import 'package:cloud_functions/cloud_functions.dart';
Future<List<Object>> getMembersByPhoneNumber(List<String> allPhoneNumbers) async {
HttpsCallable callable = FirebaseFunctions.instance.httpsCallable('membersByPhoneNumber');
final results = await callable.call(<String,dynamic>{'allPhoneNumbers': allPhoneNumbers});
return results.data;
}
服务器: index.js
const functions = require("firebase-functions");
const admin = require("firebase-admin");
if (admin.apps.length === 0) {
admin.initializeApp({
credential: admin.credential.applicationDefault(),});
}
exports.membersByPhoneNumber = functions.https.onCall((data,context) => {
return new Promise((resolve,reject) => {
if (!data || !data.allPhoneNumbers.length) return resolve([]);
const phoneNumbers = data.allPhoneNumbers;
// TODO: different scope? move vars for future use
const db = admin.firestore();
const collectionRef = db.collection("User");
let batches = [];
// because of wrong eslint parsing (dirty)
batches = [];
while (phoneNumbers.length) {
// firestore limits batches to 10
const batch = phoneNumbers.splice(0,10);
// add the batch request to to a queue
batches.push(
new Promise((response) => {
collectionRef.where("Phone","in",[...batch]).get()
.then((results) =>
response(results.docs.map(function(result) {
return result.data().Phone;
} )));
})
);
}
// response / return to client
Promise.all(batches).then(function(content) {
// console.log("content.flat()");
// console.log(content.flat());
return resolve(content.flat());
});
});
});
注意:这是我们的第一个可调用/云函数..所以欢迎提出更改建议。
本文链接:https://www.f2er.com/297881.html