Cha*_*add 0 middleware express firebase slack-api google-cloud-functions
使用@slack/interactive-message包firebase-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)
我是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之间集成监听器,请求和响应
@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)
| 归档时间: |
|
| 查看次数: |
352 次 |
| 最近记录: |