如何在Firebase cloudFunctions的express server中res.send()之后执行代码

如何在Firebase cloudFunctions的express server中res.send()之后执行代码,firebase,express,google-cloud-functions,response,connection-close,Firebase,Express,Google Cloud Functions,Response,Connection Close,我正在使用云功能构建一个express服务器,但是我面临res.send的问题。 在普通的express服务器中,我可以在res.send之后执行一些代码,但在使用Firebase cloudFunctions的express服务器上,res.send会关闭我的连接,之后我将无法执行任何代码 以下是我需要做的: 在我的服务器中,我有一个端点从Slack api对话框接收一些数据,然后Slack api正在等待一个空响应res.send,所以我需要发送它。 但我还需要将这些数据保存在我的数据库中,

我正在使用云功能构建一个express服务器,但是我面临res.send的问题。 在普通的express服务器中,我可以在res.send之后执行一些代码,但在使用Firebase cloudFunctions的express服务器上,res.send会关闭我的连接,之后我将无法执行任何代码

以下是我需要做的: 在我的服务器中,我有一个端点从Slack api对话框接收一些数据,然后Slack api正在等待一个空响应res.send,所以我需要发送它。 但我还需要将这些数据保存在我的数据库中,并在slack中向我的用户发送一条消息—您的帖子已保存! 因此,我的端点的作用是:

async function myEndpoint(req, res) {
    await savePayload(req.payload);
    await sendUserMessage(req.payload);
    res.send('');
}
但有时res.send需要很长时间才能开始运行,我在slack上遇到一个错误,因此我想做如下操作:

async function myEndpoint(req, res) {
    res.send('');
    await savePayload(req.payload);
    await sendUserMessage(req.payload);
}

但正如我所说,res.send之后,我的连接被关闭,接下来的线路无法运行。您知道如何解决这个问题吗?

响应完成后,HTTP函数立即终止执行-这是云函数的基本架构,因此无法解决。您需要:

优化代码路径,使空响应始终在截止日期之前发送,或者 触发将异步执行工作的后台函数执行,然后进行响应。这可以通过向Cloud Firestore写信或发送发布/订阅消息来实现
HTTP函数在响应完成后立即终止执行-这是云函数的基本架构,因此无法绕过。您需要:

优化代码路径,使空响应始终在截止日期之前发送,或者 触发将异步执行工作的后台函数执行,然后进行响应。这可以通过向Cloud Firestore写信或发送发布/订阅消息来实现
谢谢你的回复,迈克尔,我在想,有可能有第二个端点来为我做这项工作吗?例如,接收slack对话框数据,调用另一个端点来执行我需要的所有操作,但不等待响应,然后调用res.send?这可能会起作用,唯一的问题是,您必须等待足够长的时间,以确保第二个请求在res.send网络被钳制之前,以及在发送响应时,CPU等都已被钳制,从而真正开始处理。您可以通过超时可靠地执行此操作,但使用Pub/Sub或其他后台函数将是更可靠的解决方案。@MichaelBleigh我想在调用res.send后写入PubSub。在调用res.send之前,我是否必须等待PubSub消息成功发送并等待承诺得到解决?是的,您需要等待PubSub消息发送后再调用res.send-您不能指望在响应结束后肯定会执行任何操作。谢谢您的回复Michael,我在想,有可能有第二个端点来为我做这项工作吗?例如,接收slack对话框数据,调用另一个端点来执行我需要的所有操作,但不等待响应,然后调用res.send?这可能会起作用,唯一的问题是,您必须等待足够长的时间,以确保第二个请求在res.send网络被钳制之前,以及在发送响应时,CPU等都已被钳制,从而真正开始处理。您可以通过超时可靠地执行此操作,但使用Pub/Sub或其他后台函数将是更可靠的解决方案。@MichaelBleigh我想在调用res.send后写入PubSub。在调用res.send之前,我是否必须等待PubSub消息成功发送并等待承诺得到解决?是的,在调用res.send之前,您需要等待PubSub消息被发送-您不能指望在响应结束后肯定会执行任何操作。