如何在拦截中间件钩子的同时访问'session.conversationData' 'send'?



我一直在遵循官方指南,同时试图拦截用户/机器人消息。

bot.use({
botbuilder (session, next) {
logger.info("MESSAGE RECEIVED:" + session.message.text);
next();
},
send (event, next) {
logger.info("MESSAGE SENT:" + event.text);
next();
}
});

虽然botbuilder钩子的行为符合预期,但永远不会调用send

在我能够解决这个问题的那一刻,我的目标是拥有 访问session对象,更准确地说是从send方法中间件访问session.conversationData存储容器。

我做了什么?

我一直在关注日志记录中间件示例和自述文件状态:

中间件上的botbuilder钩子就是ISessionMiddleware的一个例子。使用此钩子而不是receive的主要优点是我们可以访问session.

sendreceive钩子使用IEventMiddleware.第一个参数是事件本身。要查看事件是否为消息,请检查event.type是否'message'

目前,我已经将session.send包装在一个自定义函数中,以便我可以记录机器人发送的消息,以及另一个记录对话框内部用户响应的函数。虽然这个解决方案解决了我的问题,但它感觉很糟糕(需要手动更新每个对话框),并且我无法创建可以从模块加载的通用中间件。

我想实现什么?

我的中间件的目的是拦截用户/机器人消息并使用以下架构将它们记录到 SQL 表中conversation-id, message-text, timestamp

conversation-id存储在session.conversationData存储容器中,因此我需要从send钩子访问session对象。

使用"botbuilder": "^3.13.1"

您可以通过调用 loadSessionWithoutDispatching 在发送中加载会话:

send: function (message, next) {
bot.loadSessionWithoutDispatching(message.address,function (error,session){
console.log(session.userData);
});
next();
}

最新更新