создатель @slack/interactive-messages
здесь ?
Короче говоря, ваше решение № 2 мне кажется правильным.Хотя у меня нет опыта работы с функциями Firebase, я довольно хорошо разбираюсь в Express, и я предоставлю некоторые подробности.
Что такое промежуточное программное обеспечение Express?
Промежуточное программное обеспечение Express - это название функции, обрабатывающей входящий HTTP-запрос.Все функции промежуточного программного обеспечения могут, на основе запроса по запросу, выбрать предварительную обработку запроса (обычно путем добавления свойства к аргументу req
), ответ на запрос или последующую обработку запроса (например, вычислениесроки между запросом и ответом).Он может делать что-то одно или комбинацию этих вещей, в зависимости от того, чего он пытается достичь.Экспресс приложение управляет стеком промежуточного программного обеспечения.Вы можете рассматривать это как список шагов, через которые может пройти запрос, прежде чем ответ будет готов.Каждый шаг в этом списке может решить предложить ответ, чтобы следующий шаг даже не был достигнут для этого запроса.
Значение cors
в вашем примере кода является функцией промежуточного программного обеспечения.Он применяет некоторые правила, от которых ваша функция Firebase должна принимать запросы.Он применяет эти правила к входящим запросам, и когда источник не разрешен, он сразу же ответит с ошибкой.В противном случае он позволяет обрабатывать запрос следующим промежуточным программным обеспечением в стеке.
В вашем примере есть другое промежуточное программное обеспечение, и это маршрутизатор.Маршрутизатор - это всего лишь промежуточное ПО, которое знает, как разделить приложение на отдельные обработчики на основе пути (части URL) во входящем запросе.Каждый экспресс app
поставляется со встроенным маршрутизатором, и вы подключили к нему обработчик, используя строку кода app.post("/go", () => {});
в своем примере.Маршрутизаторы обычно являются последним промежуточным ПО в стеке .У них есть особенность, которую люди часто не осознают.Что это за обработчики маршрутов?Они просто больше функций промежуточного программного обеспечения .Таким образом, в целом вы можете думать о маршрутизаторах как о типе промежуточного программного обеспечения, которое помогает вам разделить поведение приложения на основе пути запроса.
Что это означает для slackInteractions
?
Вы можете представить объект slackInteractions
в вашем коде как маршрутизатор, который всегда обрабатывает запрос - он никогда не передает запрос следующему промежуточному программному обеспечению в стеке.Основное различие заключается в том, что вместо разделения поведения приложения по пути запроса оно разделяет поведение, используя различные свойства взаимодействия Slack.Вы описываете, какие именно свойства вам нужны, передавая ограничения в метод .action()
.Единственное существенное различие между типичным маршрутизатором и slackInteractions
состоит в том, что само значение не является промежуточным программным обеспечением экспресс-связи, вы производите промежуточное программное обеспечение экспресс-доступа, вызывая метод .expressMiddleware()
.Он разделен таким образом, что он также может работать вне экспресс-приложения (вот когда вы можете использовать метод .start()
).
Соединяя его вместе
Как я уже сказал, у меня нет особого опыта работы с функциями Firebase, но я полагаю, что именно с этого следует начинать как минимум функцию, которая обрабатывает только взаимодействия Slack.
// Firebase Functions SDK
import functions = require("firebase-functions");
const slackbotConfig = functions.config().slackbot;
// Slack Interactive Messages Adapter
const { createMessageAdapter } = require("@slack/interactive-messages");
const slackInteractions = createMessageAdapter(slackbotConfig.signing_secret);
// Action handlers
slackInteractions.action('welcome_agree_button', (payload, respond) => {
// `payload` is an object that describes the interaction
console.log(`The user ${payload.user.name} in team ${payload.team.domain} pressed a button`);
// Your app does some asynchronous work using information in the payload
setTimeout(() => {
respond({ text: 'Thanks for accepting the code of conduct for our workspace' });
}, 0)
// Before the work completes, return a message object that is the same as the original but with
// the interactive elements removed.
const reply = payload.original_message;
delete reply.attachments[0].actions;
return reply;
});
// Express
import express = require("express");
const app = express();
app.use("/", slackInteractions.expressMiddleware());
exports.slackActions = functions.https.onRequest(app);