我在从云函数获取结果时遇到问题。
这是我的云功能:
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=7IkUgCLr5oA和 https://www.youtube.com/watch?v=652XeeKNHSk 。
关于swift - 无法通过 Cloud Functions (onCall) 将 json 数组从 Cloud Firestore 返回到 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51702830/