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

时间:2018-01-08 16:06:10

标签: node.js botframework

在尝试拦截用户/机器人消息时,我一直关注官方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的访问权限。

  

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

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

我想要实现的目标是什么?

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

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

使用"botbuilder": "^3.13.1"

1 个答案:

答案 0 :(得分:2)

您可以通过调用loadSessionWithoutDispatching:

在发送中加载会话
send: function (message, next) {
    bot.loadSessionWithoutDispatching(message.address,function (error,session){
        console.log(session.userData);
    });

    next();
}