我可以在Firebase中编写一个接受POST请求的HTTPS端点。我可以使用它并从中得到响应。我可以整天控制台.log((。
我记录每一步,因为它决定如何处理请求,但一旦我试图保存到Firestore,整个端点就会静音。步骤1-7过去是愉快地控制台.log((,现在步骤8将整个过程吸入黑洞。
我认为我在async/await/promise上做了一些错误,所以我用一个愚蠢的setTimeout promise替换了"步骤8"。这很好:我的promise在2000毫秒后写入console.log。然后我觉得我保存的数据有问题(因为这一切都是从我试图修复有关在Firestore中存储日期的警告开始的(。我再次用{test:"test"}-黑洞替换了我的数据。
似乎只是保存到数据库的行为就产生了一个黑洞。但只在这一个端点上。我有其他人做类似的事情也很好。
我已经研究这个问题好几天了,所以任何帮助都将不胜感激。
app.post("/webhook", async (req: express.Request, res: express.Response) => {
if(req.body.token !== functions.config().service.verification_token)
throw new Error("Unauthorized access");
if(req.body.type === "url_verification")
{
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('CHALLENGE_RESPONSE');
return;
}
res.end("OK");
if(DEBUG) { console.log("Received a request", req.body); }
if(req.body.type === "event_callback")
{
if(DEBUG) { console.log("This request appears to be an event"); }
if(req.body.event.type === "message")
{
if(DEBUG) { console.log("This event appears to concern a message"); }
if(shouldIgnoreMessage(req.body.event))
{
if(DEBUG) { console.log("Actually, this event is not something we care about. We're done here."); }
return;
}
if(DEBUG) { console.log("Whoa-ho! This is a message from a user! We have to deal with this."); }
saveToFirebase(req.body).catch(err => console.error(err));
}
}
});
看起来您在promise 之前缺少了一个await
我还建议删除您的res.end("OK");
,因为它将结束响应过程。或者根据端点中的逻辑是成功还是失败,向下移动它以给出实际响应。
试试这个:
try {
const saved = await saveToFirebase(req.body);
console.log('Saved to firebase', saved)
return res.sendStatus(200);
} catch(err) {
console.log(err);
return res.sendStatus(500);
}