# #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 теперь намного быстрее и его можно использовать.