Используйте Firebase onRequest () или Express app.use () для Slack API - PullRequest
0 голосов
/ 18 сентября 2018

Цель

Используйте пакет @slack/interactive-message с firebase-functions для прослушивания и ответа на сообщения и диалоги Slack.

Вопрос

Я не уверен, какиспользуйте @slack/interactive-message слушатель с firebase.

1) Я использую Firebase functions.https.onRequest(), и как-то передает req из Slack в slackInteractions.action()?

ИЛИ

2) Использую ли я app.use("/app", slackInteractions.expressMiddleware()); Если да, то куда slackInteractions.action() s идут ?

ИЛИ

3) Что-то еще?

Код

// Express
import express = require("express");
const app = express();
const cors = require("cors")({
  origin: "*"
});
app.use("*", cors);

// Firebase Functions SDK
import functions = require("firebase-functions");

const slackbotConfig = functions.config().slackbot;
const { createMessageAdapter } = require("@slack/interactive-messages");
const slackInteractions = createMessageAdapter(slackbotConfig.signing_secret);

app.use("/app", slackInteractions.expressMiddleware());

// Express route
app.post("/go", (req, res) => {
  console.log("Hello from Express!");
  res
    .status(200)
    .send("Hello from Express!")
    .end();
});

exports.app = functions.https.onRequest(app);

exports.helloWorld = functions.https.onRequest((_req, res) => {
  console.log("Hello from Firebase!");
  res
    .status(200)
    .send("Hello from Firebase!")
    .end();
});

tl; др

Я новичок в деталяхЭкспресс и использование промежуточного программного обеспечения.Примеры @slack/interactive-message show ...

slackInteractions.start(port).then(() => {
  console.log(`server listening on port ${port}`);
});

... и с функциями облака Firebase этот бит не имеет значения.Я не уверен, как слушатели, запросы и ответы интегрированы между Firebase и @ slack / interactive-message

1 Ответ

0 голосов
/ 18 сентября 2018

создатель @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);
...