我正在通過 Axios async-await 呼叫第三方 API,并通過谷歌云函式將結果回傳到顫振應用程式。我被迫使用,因為據我所知,functions.https.onCallflutter 無法呼叫函式。onRequest
結果console.log在云函式的日志中正確顯示,但是當顫振應用程式呼叫該函式時,它總是在接收null. 為什么?
getSmsBalance: functions.https.onCall(async (data, context) => {
const business_id = data.business_id;
const collectionRef = db.collection("buser_sms");
const snapshot = await collectionRef.where("id", "==", business_id).get();
if (snapshot.empty) {
console.log("No matching documents - getSMSBalance .");
let response = {
status: false,
};
return JSON.stringify(response);
}
snapshot.forEach((doc) => {
if (
doc.data().enableReservationSms == true ||
doc.data().enableAutoReminder == true ||
doc.data().enableReminderSms == true
) {
// get balance
(async () => {
const balance = await getBalance(
doc.data().senderId,
doc.data().username,
doc.data().password
)
.then((result) => {
let response = {
status: true,
data: result,
};
console.log("balance is " result);
return JSON.stringify(response);
})
.catch((err) => {
console.error(`Error - getSmsBalance - ${err}`);
let response = {
status: false,
};
return JSON.stringify(response);
});
})();
}
});
}),
uj5u.com熱心網友回復:
您的代碼有幾個問題:
- 您在 an 內部使用 async/await 語法
Array.forEach,由于其內在設計,它不允許等待。如果你想在回圈迭代中使用 async/await,你需要使用Array.map例如。但在大多數情況下,您不應該在回圈中使用 async/await,因為它消除了異步代碼執行的優勢(每次迭代僅在前一次迭代之后觸發)。 - 你不會從你的函式中回傳任何東西,除了
snapshot.empty. 和回呼中的returns僅將值分配給以后不使用的變數。thencatchbalance
所以總而言之,你需要使用類似的東西:
return Promise.all(
snapshot.docs.map(function (doc) {
return getBalance(
doc.data().senderId,
doc.data().username,
doc.data().password
)
.then((result) => {
let response = {
status: true,
data: result,
};
console.log('balance is ' result);
return JSON.stringify(response);
})
.catch((err) => {
console.error(`Error - getSmsBalance - ${err}`);
let response = {
status: false,
};
return JSON.stringify(response);
});
})
);
請注意,我提供的代碼被截斷,而沒有考慮您實際需要什么格式作為輸出。擁有一個 s 陣列response可能不是您所需要的。但是您應該能夠使該代碼最終適應您的需要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/462991.html
標籤:javascript 节点.js 扑 谷歌云功能
