Как выполнить код после res.send () на экспресс-сервере в Firebase cloudFunctions - PullRequest
0 голосов
/ 02 октября 2019

Я строю экспресс-сервер с использованием облачных функций, но столкнулся с проблемой res.send(). На обычном экспресс-сервере я могу выполнить некоторый код после res.send(), но на моем экспресс-сервере использование Firebase cloudFunctions res.send() закрывает мое соединение, и после этого я ничего не могу выполнить.

Вот что мне нужносделать: На моем сервере у меня есть конечная точка для получения некоторых данных из диалога Slack api, и после этого Slack Api ожидает пустой ответ res.send(), поэтому мне нужно отправить его. Но мне также нужно сохранить эти данные в моей БД и отправить сообщение в слабом виде моему пользователю «Ваш пост был сохранен!» Итак, что делает моя конечная точка:

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

Ноиногда res.send() занимает много времени, чтобы начать работать, и я получаю сообщение об ошибке, поэтому я хотел бы сделать что-то вроде:

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

Но, как я уже сказал, после res.send('') мое соединение закрывается иследующие строки не запускаются. Вы знаете, как я могу обойти это?

1 Ответ

2 голосов
/ 03 октября 2019

HTTP-функции немедленно прекращают выполнение после завершения ответа - это фундаментальная архитектура для облачных функций, поэтому нет никакого способа обойти это. Вам нужно будет либо:

  1. оптимизировать пути кода таким образом, чтобы пустой ответ всегда отправлялся в срок, либо
  2. инициировать выполнение фоновой функции, которая будет выполнять работу асинхронно,тогда ответь. Это можно сделать, например, написав в Cloud Firestore или отправив сообщение Pub / Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...