将Microsoft Bot Framework与Node Express Web站点集成

时间:2016-10-13 20:03:42

标签: node.js botframework

我正在试验Microsoft Bot Framework。在我的实验中,我试图整合" Hello World"进入现有的网络应用程序。我的网络应用程序是一个快速的Node.js应用程序。

在我的Node.js应用程序中,我希望有一个网页,其中包含一个文本框,让我向僵尸网站发送消息。基本上,我试图模仿网页中的框架通道模拟器。为了做到这一点,我有一个包含以下内容的网页:

bot.html

<form>
  <div class="input-group">
    <input id="message" type="text" class="form-control" placeholder="">
    <span class="input-group-btn">
      <button id="sendButton" class="btn btn-secondary" type="button">send</button>
    </span>
  </div>
</form>

...

$('#sendButton').click(onSendButtonClick);
function onSendButtonClick() {
    var message = $('#message').val();
    if (message) {
        $.post('/my-bot', function(data, status) {
            console.log(data);
            console.log(status);
        });
    }
    return false;
}

然后,在服务器端,在使用Express的Node.js应用程序中,我有以下内容:

// This route is intended to listen for messages POSTed from the text box on my web site.
app.post('/my-bot', function(req, res) {
    try {
        // Not sure about this...
        let connector = new BotBuilder.ConsoleConnector().listen();            
        let bot = new BotBuilder.UniversalBot(connector );
        bot.dialog('/', function (session) {                
            session.send('Hello World');
        });
    } catch (ex) {
        res.status(500);
        res.end();
    }
});

// The following serves up my web page
app.use('/my-bot', function(req, res) { 
    let view = './bot.html';        
    res.render(view, {});
});

我不确定如何获得&#34; Hello World&#34;回到我的网页。我看到了session.send的来电,但我没有看到将session连接到res对象的方法。或者我完全误解了这个架构?

2 个答案:

答案 0 :(得分:2)

app.post中的回调应为connector.listen(),您应该只定义/呼叫connector一次。调用connector.listen()将返回适合快速回调的函数,并且因为您的连接器连接到bot,所以您的机器人对话框路径将在POST时激活。

以下是一个示例应用:

var express = require('express')
  , http = process.env.HTTPS == 'on' ? require('https') : require('http')
  , builder = require('botbuilder');

var app = express()
  , server = http.createServer(app)
  , port = process.env.port || 3000
  , config = { appId: process.env.MICROSOFT_APP_ID, appPassword: process.env.MICROSOFT_APP_PASSWORD }
  , connector = new builder.ChatConnector(config)
  , bot = new builder.UniversalBot(connector);

// define bot dialog routes
bot.dialog('/', function(session) {
  session.send('Hello World');
});

// define app HTTP routes
app

  // respond to basic HTTP GET
  .get('/', function(req, res) {
    res.send('hello world');
  })

  // respond to bot messages
  .post('/api/messages', connector.listen());

// start the server
server.listen(port, function() {
  console.log('Listening on %s', port);
});

我发现你正试图处理潜在的错误。如果您需要向客户传达失败,则应拨打session.error()来代替session.send()

bot.dialog('/', function (session) {

  // do some processing
  var gotError = true;

  // respond with error
  if (gotError) {
    session.error(new Error('oops'))

  // respond normally
  } else {
    session.send('Hello World');
  }
});

答案 1 :(得分:0)

尝试使用Direct Line API

  

Direct Line API是一个简单的REST API,可直接连接到单个机器人。此API适用于编写自己的客户端应用程序,Web聊天控件,移动应用程序或将与其机器人通信的服务到服务应用程序的开发人员