1

我正在使用谷歌云功能作为 webhook 来接收来自 3rd 方服务的有效负载。通常,当此类服务向 webhook 发出请求时,它们期望 HTTP 200 作为确认。但是,使用如下的云功能设置(并且按照 google 的建议),当正在进行的处理发生时,请求服务会返回 408。

在这种情况下,第 3 方服务(在这种情况下是它的 cloudmailin,但同样适用于我尝试与之集成的任何 webhook)将重试请求,即使它已成功处理。

我的问题是:如何让云函数返回 200 并仍然继续异步处理?

//This will return a 408 even though the request is processed successfully
exports.emailIngest = functions.https.onRequest((request, response) => 
{
    //return the promise from the firestore admin SDK as per google docs
    return admin.auth().getUserByEmail(request.body.envelope.from).then((user) => {
      console.log('Successfully fetched user data:', user.toJSON());
    }).catch(function (error) {
      console.log('Error fetching user data:', error);
    });
});
4

1 回答 1

1

由于 HTTP 触发器在发送响应后被有效地终止和清理,因此在发送响应后您将无法在函数中继续异步工作。您需要做的是让 HTTP 函数将工作委托给其他一些在 HTTP 请求范围之外继续运行的后台函数。

一种方法是使用pubsub 触发器。HTTP 触发器可以广播 pubsub 消息,然后导致 pubsub 触发器执行。Pubsub 需要为项目启用计费。

另一种方法是写入实时数据库或 Firestore 中的某个位置,并使用另一个函数触发器来响应该写入。另一个函数可能希望在终止之前删除写入的数据。

于 2018-11-15T17:20:27.603 回答