我有以下函数,我正在尝试将一组地图返回到我的flutter应用
export const usersFromContacts = functions.region('europe-west1').https.onCall(async (data, context) => {
Authentication.authenticate(context);
const phonenumbers = Validator.validateArray<string>('phonenumbers', data['phonenumbers']);
const privateDataPromises = [];
for (let i = 0; i < phonenumbers.length; i++)
privateDataPromises.push(...(await firestore.collectionGroup('userPrivateData')
.where('phonenumber', '==', phonenumbers[i]).get()).docs);
const userSnapshots = await Promise.all(privateDataPromises);
const userPromises = [];
for (let i = 0; i < userSnapshots.length; i++) {
const userID = privateDataPromises[i].id;
userPromises.push(userCollection.doc(userID).get());
}
const returnValue = (await Promise.all(userPromises)).map((document) => UserModel.fromFirestoreDocumentData(document).toMap());
console.log(returnValue);
return returnValue;
});
如果我将测试字段记录到云功能控制台,我会得到正确的映射数组和映射中的正确数据。
[ Map {
'id' => 'ID',
'displayName' => 'Name',
'phoneNumber' => 'Phonenumber',
'photoUrl' => 'PhotoUrl' } ]
是我在firebase函数控制台中得到的。其中我替换了c的值。
然后在内部颤动我做
Future<HttpsCallableResult> _callCloudFunction(String functionName, {Map<String, dynamic> data}) async {
final cloudFunction = api.getHttpsCallable(functionName: functionName);
try {
final httpCallable = await cloudFunction.call(data).timeout(Duration(seconds: timeout));
print(httpCallable.data); // this prints [{}] an empty array of maps?
return httpCallable;
} on CloudFunctionsException catch (error) {
throw new UserFriendlyException(error.code, error.message);
} on TimeoutException catch (error) {
throw new UserFriendlyException('Operation Failed', error.message);
} catch (error) {
throw new UserFriendlyException('Operation Failed', 'There was a problem with with executing the operation');
}
}
我得到了一个空的地图阵列?我做错了什么?
我很确定这个调用是正确的,因为如果我直接返回文档,我确实会在前端得到它们,所以我是否以错误的方式从函数返回值?
您正试图将ES6-Map对象从函数序列化到客户端。这不会按你想要的方式工作。
Cloud函数可调用函数仅支持序列化纯JavaScript对象、数组和基元值。与其传递Map,不如传递一个普通的JS对象。这是您必须更改的代码:
UserModel.fromFirestoreDocumentData(document).toMap()
您必须进入toMap
函数并对其进行更改,或者将其输出转换为普通的JS对象进行序列化。