Firebase Cloud Functions - JavaScript/Typescript Promise reject() პრობლემა
მე ვაკეთებ Cloud Functions მეთოდების გამოყენებას, როგორიცაა:
export const someCallableCloudFunction = functions.https.onCall((data, context) => {
[…]
return new Promise((resolve, reject) => {
[…]
if (someStatement) {
resolve("resolveDataString")
} else {
reject({ status: "error", code: "429", message: "someErrorMessage" })
}
})
})
და წყვეტა მათ ეთანხმება:
firebase.functions().httpsCallable("someCallableCloudFunction")(/*some args*/)
.then(data => { /* data = "resolveDataString" */ })
.catch(error => { /* here's the problem */ })
პრობლემა: ეს არის როგორ ჩანს შეცდომა კლაინტში, რომელიც იძახებს მეთოდს: [შეცდომა: შიდა]. და ეს არის როგორ ჩანს შეცდომის ლოგი Firebase Cloud Functions კონსოლში (ემულატორი!):
{
"status": "error",
"code": "429",
"message": "Unhandled error",
"severity": "ERROR"
}
resolve() მუშაობს იდეალურად, მაგრამ reject() 1) არ გამოდის სწორად Cloud Functions მეთოდში განსაზღვრული შეცდომის ობიექტის დაბეჭდვა და 2) არ გადასცემს შეცდომის ობიექტს კლაინტს. ამის ნაცვლად, კლაინტი იღებს [Error: INTERNAL].
მჭირდება თუ არა resolve()-ის გამოყენება როგორც resolve, ასევე reject და define განცხადებებისთვის, რომლებიც შეიძლება იქნეს დამუშავებული კლიენტის მიერ?
პასუხი #1
როგორც დოკუმენტშია ახსნილი:
მოდუნებული იმისთვის, რომ მომხმარებელს მიიღოს სასარგებლო შეცდომის დეტალები, დააბრუნეთ შეცდომები callable-დან, დახვეტვით (ან Promise-ის დაბრუნებით, რომელიც უარყოფილია)
functions.https.HttpsErrorკლასის მაგალითით.
და
თუ თქვენს ფუნქციებიდან ჰპყრობილი იქნება ჰტდფსთქარუ (HttpsError)-ის გარდა სხვა შეცდომა, თქვენს კლიენტს მის ნაცვლად მიღებული ექნება შეცდომა INTERNAL შეტყობინებით და კოდით internal.