【问题标题】:Unable to return an array of json from Cloud Firestore via Cloud Functions (onCall) to Swift无法通过 Cloud Functions (onCall) 从 Cloud Firestore 将 json 数组返回给 Swift
【发布时间】:2018-08-06 07:46:32
【问题描述】:

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

这是我的云功能:

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" }; 时,我什至无法收到。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    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 团队关于云函数和承诺的这两个视频:https://www.youtube.com/watch?v=7IkUgCLr5oAhttps://www.youtube.com/watch?v=652XeeKNHSk

    【讨论】:

    • 效果很好,非常感谢您的帮助和链接,我会检查出来的。
    猜你喜欢
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 2018-03-23
    • 2021-11-27
    • 1970-01-01
    • 2021-08-15
    • 2018-03-27
    • 2020-10-15
    相关资源
    最近更新 更多