Почему использование функций Firebase в качестве конечной точки API происходит так медленно?

# #node.js #firebase #google-cloud-functions #slack

Вопрос:

Я создал приложение в Slack, которое при взаимодействии в Slack отправляет запрос HTTP POST на URL-адрес. Этот URL — адрес является функцией Firebase, которая запускается с помощью HTTP — запроса.

Функция Firebase выглядит следующим образом…

 // process incoming shortcuts
exports.interactions = functions.https.onRequest(async (request, response) => {
  response.send();
  const payload = JSON.parse(request.body.payload);
  functions.logger.log(payload);

  if (payload.type === 'shortcut') {
    functions.logger.log('Found a shortcut...');
    const shortcuts = require('./shortcuts');
    await shortcuts(payload);
  } else if (payload.type === 'block_actions') {
    functions.logger.log('Found a block action...');
    const blockActions = require('./blockActions');
    await blockActions(payload);
  } else if (payload.type === 'view_submission') {
    functions.logger.log('Found a view submission...');
    const viewSubmissions = require('./viewSubmissions');
    await viewSubmissions(payload);
  }
  functions.logger.log('Done with interactions.');
});
 

Проблема в том, что Firebase отвечает за 5-10 секунд, а Slack ожидает ответа через 3 секунды.

Таким образом, приложение в Slack ошибается.

Ответ №1:

Оказывается, в то время как я думал, что было бы полезно выполнить response.send() проверку сразу при вызове функции, чтобы Slack получил мгновенный отклик, я также непреднамеренно запускал фоновые действия в Firebase.

Строка в приведенных выше документах Firebase, которая дала мне самую большую подсказку, была:

Фоновую активность часто можно обнаружить в журналах отдельных вызовов, обнаружив все, что регистрируется после строки, в которой говорится, что вызов завершен.

Которую я нашел здесь… функция запустилась и завершилась, а затем начал выполняться код для открытия модала…

введите описание изображения здесь

Затем я нашел в документах Firebase

Завершите функции HTTP с помощью res.redirect(), res.send () или res.end().

Так что все, что мне действительно нужно было сделать, это перейти response.send() к концу функции. Кроме того, я должен был убедиться, что у меня есть await инструкции перед моими асинхронными функциями, чтобы асинхронные функции ждали разрешения перед выполнением окончательного response.send()

 // process incoming shortcuts
exports.interactions = functions.https.onRequest(async (request, response) => {
  const payload = JSON.parse(request.body.payload);
  functions.logger.log(payload);

  if (payload.type === 'shortcut') {
    functions.logger.log('Found a shortcut...');
    const shortcuts = require('./shortcuts');
    await shortcuts(payload);
  } else if (payload.type === 'block_actions') {
    functions.logger.log('Found a block action...');
    const blockActions = require('./blockActions');
    await blockActions(payload);
  } else if (payload.type === 'view_submission') {
    functions.logger.log('Found a view submission...');
    const viewSubmissions = require('./viewSubmissions');
    await viewSubmissions(payload);
  }
  functions.logger.log('Done with interactions.');
  response.send();
});
 

Время отклика модального взаимодействия в Slack теперь намного быстрее и его можно использовать.