代码之家  ›  专栏  ›  技术社区  ›  Chadd Yasin Özcan

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

  •  0
  • Chadd Yasin Özcan  · 技术社区  · 6 年前

    目标

    @slack/interactive-message firebase-functions 倾听和回应闲散的信息和对话。

    问题

    我不知道怎么用这个 @松弛/交互式消息 firebase的侦听器。

    1) 我用Firebase的吗 functions.https.onRequest() 以某种方式 req 从无到有 slackInteractions.action()

    或者

    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();
    });
    

    热释光;博士

    我对Express和使用中间件的细节很陌生。示例 显示。。。

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

    …与Firebase云功能无关。我不确定Firebase和@slack/interactive message之间是如何集成侦听器、请求和响应的

    1 回复  |  直到 6 年前
        1
  •  6
  •   Ankur    6 年前

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

    什么是express中间件?

    Express中间件是一种处理传入HTTP请求的函数的名称。所有中间件功能都可以逐个请求选择预处理请求(通常是通过将属性添加到 req 参数),响应请求,或对请求进行后处理(如计算请求和响应之间的时间)。它可以做这些事情的任何一个或组合,这取决于它试图完成什么。express应用程序管理一堆中间件。您可以将其视为在响应准备就绪之前请求可能完成的步骤列表。列表中的每一步都可以决定提供响应,这样就连下一步的请求都不会到达。

    这个 cors 代码示例中的值是一个中间件函数。它应用了一些有关Firebase函数应该接受来自哪个源的请求的规则。它将这些规则应用于传入的请求,当不允许源站时,它将立即响应错误。否则,它允许堆栈中的下一个中间件处理请求。

    在您的示例中还有另一个中间件,那就是路由器。路由器只是一种中间件,它知道如何根据传入请求中的路径(URL的一部分)将应用程序拆分为单独的处理程序。每一个快车 app 附带了一个内置路由器,您使用 app.post("/go", () => {}); 堆栈中的最后一个中间件 . 它们确实有一个人们通常没有意识到的特殊功能。这些路由处理程序是什么?他们只是 . 所以总体来说,您可以将路由器视为一种中间件,它可以帮助您根据请求的路径划分应用程序行为。

    这对我来说意味着什么 slackInteractions ?

    对象作为路由器 处理请求-它从不将请求传递到堆栈中的下一个中间件。关键的区别在于,它不是用请求的路径来划分应用程序行为,而是使用松弛交互的各种属性来划分行为。你呢 describe which properties exactly you care about by passing in constraints .action() 懒散的互动 ,即值本身不是express中间件,通过调用 .expressMiddleware() 方法。它是这样分开的,这样它也可以在express应用程序之外工作(这时您可以使用 .start() 方法)。

    把它放在一起

    就像我说的,我没有具体使用Firebase函数的经验,但是我认为对于一个只处理松散交互的函数,您至少应该从这里开始。

    // 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);