在尝试拦截用户/机器人消息时,我一直关注官方guidelines。
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
对象,更准确地说是从session.conversationData
方法中间件访问send
存储容器。
我做了什么?
我一直关注Logging middleware example和自述状态:
中间件上的
botbuilder
挂钩是ISessionMiddleware
的示例。使用此挂钩而不是receive
的主要优点是我们获得session
的访问权限。
和
send
和receive
个钩子使用IEventMiddleware
。第一个参数是事件本身。要查看某个消息是否为消息,请检查event.type
是否为'message'
。
目前我已将session.send
包装在自定义函数中,以便我可以记录机器人发送的消息,以及另一个记录用户响应的功能。虽然这个解决方案解决了我的问题,但感觉很糟糕(需要手动更新每个对话框),而且我无法创建可以从模块加载的通用中间件。
我想要实现的目标是什么?
我的中间件的目的是拦截用户/机器人消息并使用以下模式将它们记录到SQL表:conversation-id, message-text, timestamp
。
conversation-id
存储在session.conversationData
存储容器中,因此我需要从session
挂钩访问send
对象。
使用"botbuilder": "^3.13.1"
答案 0 :(得分:2)
您可以通过调用loadSessionWithoutDispatching:
在发送中加载会话send: function (message, next) {
bot.loadSessionWithoutDispatching(message.address,function (error,session){
console.log(session.userData);
});
next();
}