最小可重現代碼:
index.ts:
import * as admin from "firebase-admin"
import fetch, { Headers } from "node-fetch";
interface BarPayload {
topic: string,
token: string,
}
exports.bar = functions.https.onCall(async (data, context) => {
if (data != null) {
const payload: BarPayload = {
topic: data.topic,
token: data.token,
}
const url = `https://${location}-${project}.cloudfunctions.net/subscribeToTopic`
await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
topic: payload.topic,
token: payload.token,
}),
})
}
return null;
});
export const subscribeToTopic = functions.https.onRequest(async (req, res) => {
const payload = req.body as BarPayload;
fetch('https://iid.googleapis.com/iid/v1/' payload.token '/rel/topics/' payload.topic, {
method: 'POST',
headers: new Headers({
'Authorization': 'key=AA...Wp9',
'Content-Type': 'application/json'
})
}).then(response => {
if (response.status < 200 || response.status >= 400) {
res.sendStatus(299)
}
}).catch(error => {
console.error(error);
res.sendStatus(299)
})
return Promise.resolve();
})
我bar在 Flutter 中運行,在 Logs Explorer 中看到超時錯誤:
textPayload:“函式執行耗時 60051 毫秒。完成狀態:超時”
但是,如果我將我subscribeToTopic的 HTTP 函式更改為可呼叫函式,那么它可以正常作業。例如:
exports.subscribeToTopic = functions.https.onCall(async (data, context) => {
fetch('https://iid.googleapis.com/iid/v1/' data.token '/rel/topics/' data.topic, {
method: 'POST',
headers: new Headers({
'Authorization': 'key=AA...Wp9',
'Content-Type': 'application/json'
})
}).then(response => {
if (response.status < 200 || response.status >= 400) {
console.log('Error = ' response.error);
}
}).catch(error => {
console.error(error);
})
return null;
});
(我知道我犯了一些小錯誤,而且我是 Typescript 的新手。任何幫助將不勝感激:)
uj5u.com熱心網友回復:
您不應該return Promise.resolve();在 HTTPS 云函式中執行以下操作:
- HTTPS 云功能應以
send(),redirect()或end(); return Promise.resolve();在異步呼叫 fetch 完成之前執行。
以下應該可以解決問題(未經測驗):
export const subscribeToTopic = functions.https.onRequest(async (req, res) => {
try {
const payload = req.body as BarPayload;
const response = await fetch('https://iid.googleapis.com/iid/v1/' payload.token '/rel/topics/' payload.topic, {
method: 'POST',
headers: new Headers({
'Authorization': 'key=AA...Wp9',
'Content-Type': 'application/json'
})
});
if(response.status < 200 || response.status >= 400) {
res.status(299).send();
}
} catch (error) {
res.status(400).send();
}
})
但是我不明白您為什么將業務邏輯分成兩個云功能。為什么不直接https://iid.googleapis.com在barCallable Cloud Function 中獲取?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/466769.html
標籤:javascript 打字稿 火力基地 扑 谷歌云功能
