我一直在遵循官方指南,同时试图拦截用户/机器人消息。
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
.
和
send
和receive
钩子使用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();
}