对Slack API使用Firebase onRequest()或Express app.use()

Cha*_*add 0 middleware express firebase slack-api google-cloud-functions

目标

使用@slack/interactive-messagefirebase-functions来监听和响应Slack消息和对话框.

我不确定如何使用@slack/interactive-messagefirebase 的监听器.

1)我是否使用Firebase functions.https.onRequest(),并以某种方式req从Slack 传递到 slackInteractions.action()

要么

2)我使用的app.use("/app", slackInteractions.expressMiddleware());如果是这样,你在哪里slackInteractions.action()小号

要么

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();
});
Run Code Online (Sandbox Code Playgroud)

TL;博士

我是Express的新细节和使用中间件的新手.@slack/interactive-message节目的例子......

slackInteractions.start(port).then(() => {
  console.log(`server listening on port ${port}`);
});
Run Code Online (Sandbox Code Playgroud)

...并且使用Firebase云功能,此位无关紧要.我不确定如何在Firebase和@slack/interactive-message之间集成监听器,请求和响应

Ank*_*kur 5

@slack/interactive-messages这里的创造者

简而言之,您的解决方案2对我来说似乎是正确的.虽然我没有使用Firebase功能的经验,但我对快递有很好的理解,我将提供更多细节.

什么是快递中间件?

Express中间件是一种处理传入HTTP请求的函数的名称.所有中间件函数都可以在请求的基础上选择预处理请求(通常通过向req参数添加属性),响应请求或后处理请求(如计算时间之间的时间)请求和响应).它可以做任何一个或这些事情的组合,取决于它想要完成什么.快递应用程序管理一堆中间件.您可以将此视为请求在响应准备好之前可能完成的步骤列表.该列表中的每个步骤都可以决定提供响应,以便甚至无法为该请求达到下一步.

cors代码示例中的值是中间件函数.它适用于一些规则,说明Firebase功能应从哪些来源接受请求.它将这些规则应用于传入请求,并且当不允许原点时,它将立即响应错误.否则,它允许请求由堆栈中的下一个中间件处理.

您的示例中还有另一个中间件,那就是路由器.路由器只是一种中间件,它知道如何根据传入请求中的路径(URL的一部分)将应用拆分为单独的处理程序.每个express 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);
Run Code Online (Sandbox Code Playgroud)