swift - 无法通过 Cloud Functions (onCall) 将 json 数组从 Cloud Firestore 返回到 Swift

标签 swift firebase google-cloud-firestore swift4 google-cloud-functions

我在从云函数获取结果时遇到问题。

这是我的云功能:

exports.retrieveTrips = functions.https.onCall((data, context) => {
 const uidNumber = context.auth.uid;

 var arrayOfResults = new Array();

 var idOfFoundDoc;
 var query = admin.firestore().collection('Users').where('UID','==', uidNumber);
 query.get().then(snapshot => 
 {
     snapshot.forEach(documentSnapshot => 
     {
          idOfFoundDoc = documentSnapshot.id;
     });
     var queryDoc = admin.firestore().collection('Users').doc(idOfFoundDoc).collection('Trips');
     queryDoc.get().then(snapshot => 
     {
         snapshot.forEach(documentSnapshot => 
         {
             arrayOfResults.push(documentSnapshot.data());
         });
        console.log('ARRAY: ' , arrayOfResults);
        return arrayOfResults; 
     })
     .catch (err => 
     {
        console.log ('Error adding document: ', err);
     });

 })
 .catch (err => {

        //response.send('Error getting documents', err);
        console.log ('Error getting documents', err);
 });

这是我的应用程序中的代码。

    @IBAction func RetrieveTripsButton(_ sender: Any)
{

    self.functions.httpsCallable("retrieveTrips").call() {(result, error) in
        if let error = error as NSError? {
            if error.domain == FunctionsErrorDomain
            {
                let message = error.localizedDescription
                print ("Message: " + message)
            }
            return
        }

        print ("Result: -> \(type(of: result))")
        print("Result.data type: \(type(of: result?.data))");
        print ("Result.data -> \(result?.data)")
    }
}

这是打印的结果。

Result: -> Optional<FIRHTTPSCallableResult>
Result.data type: Optional<Any>
Result.data -> Optional(<null>)

控制台日志能够正确打印 arrayOfResults。此外,当我将此函数更改为 onRequest 并向其提供相关信息时,res.status(200).send(arrayOfResults) 能够在页面中显示 JSON 数组。

如果我将 return arrayOfResults; 放在 .then 函数之外,我将得到一个结果以及一个空数组。我的问题类似于 this problem here但当我返回 { text: "some_data"}; 时我什至无法收到。

任何帮助都会很棒,谢谢!

最佳答案

您必须链接不同的 promise 并返回 promise 链的结果,如下所示。

请注意,这实际上是OP在对您提到的SO帖子的回答中所解释的“问题是我忘记从云函数返回实际的 promise ”。

exports.retrieveTrips = functions.https.onCall((data, context) => {
 const uidNumber = context.auth.uid;

 const arrayOfResults = new Array();

 let idOfFoundDoc;
 const query = admin.firestore().collection('Users').where('UID','==', uidNumber);

 return query.get().then(snapshot => {  // here add return
     snapshot.forEach(documentSnapshot => 
     {
          idOfFoundDoc = documentSnapshot.id;
     });
     const queryDoc = admin.firestore().collection('Users').doc(idOfFoundDoc).collection('Trips');
     return queryDoc.get();   // here add return and chain with then()
 })
 .then(snapshot => {
         snapshot.forEach(documentSnapshot => {
             arrayOfResults.push(documentSnapshot.data());
         });
        console.log('ARRAY: ' , arrayOfResults);
        return { arrayOfResults : arrayOfResults }; //return an object

 })
 .catch (err => {
        console.log ('Error getting documents', err);
        //Here you may return an error as per the documentation https://firebase.google.com/docs/functions/callable#handle_errors, i.e. by throwing an instance of functions.https.HttpsError         
 });

});

我还建议您观看 Firebase 团队提供的两个有关 Cloud Functions 和 promise 的视频:https://www.youtube.com/watch?v=7IkUgCLr5oAhttps://www.youtube.com/watch?v=652XeeKNHSk

关于swift - 无法通过 Cloud Functions (onCall) 将 json 数组从 Cloud Firestore 返回到 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51702830/

相关文章:

swift - 从 Swift 2.x 到 4.0 的代码迁移问题

ios - 从表格 View 中删除不必要的行

android - 在 : 'error: cannot find symbol variable cordova' 中检索 cordova 上下文结果

google-cloud-firestore - 用于离线保​​存在android中的firestore回调

ios - Firestore 离线未更新

ios - 'UITableViewCell ?' does not have a member named ' 文本标签'

ios - 如何更改 UIScrollView 指示器颜色?

删除所有文件后 Firebase 存储状态已满

java - 如何在firebase数据库中进行多个查询?

如果不创建则 Flutter Firestore 更新(如果存在)