Интеграция Microsoft Bot Framework с веб-сайтом Node Express

#node.js #botframework

#node.js #botframework

Вопрос:

Я экспериментирую с Microsoft Bot Framework. В своем эксперименте я пытаюсь интегрировать «Hello World» в существующее веб-приложение. Мое веб-приложение — это экспресс Node.js приложение.

В моем Node.js приложение, я хочу иметь веб-страницу с текстовым полем, позволяющим мне отправить сообщение боту. По сути, я пытаюсь имитировать эмулятор канала framework на веб-странице. В попытке сделать это у меня есть веб-страница со следующим:

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;
}
 

Затем, на стороне сервера, в моем Node.js приложение, которое использует Express, у меня есть следующее:

 // 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, {});
});
 

Я не уверен, как вернуть «Привет, мир» на мою веб-страницу. Я вижу вызов session.send , но я не вижу способа подключиться session к res объекту. Или я вообще неправильно понимаю архитектуру?

Ответ №1:

Обратный вызов в вашем app.post должен быть connector.listen() , и вы должны определять / вызывать только connector один раз. Вызов connector.listen() вернет функцию, подходящую для обратных вызовов в стиле express, и, поскольку ваш соединитель подключен bot , маршруты диалога вашего бота будут активированы при отправке.

Вот пример приложения:

 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');
  }
});
 

Ответ №2:

Попробуйте использовать API Direct Line.

Direct Line API — это простой REST API для прямого подключения к одному боту. Этот API предназначен для разработчиков, пишущих свои собственные клиентские приложения, элементы управления веб-чатом, мобильные приложения или приложения «сервис-сервис», которые будут взаимодействовать с их ботом

Комментарии:

1. Теперь ссылка не работает