BotFramework Post Request Body не сохраняется в session.userData - PullRequest
0 голосов
/ 27 февраля 2019

Используя POST-запрос, я отправляю предоставленную пользователем информацию в API, который предоставит специфичную для пользователя информацию.

Теперь я хочу сохранить информацию, регургитированную POST-запросом, как переменную, которую я могу использовать вдругие функции / диалоги.

Я пробовал следующее:

  1. Сохранить тело запроса POST в переменной session.userData.xxx
  2. Объявлена ​​глобальная переменнаяи использовал его для хранения тела.
  3. Объявил переменную в запросе post, в которой я сохранил тело

Версия кода, которую я сделал, выглядит следующим образом:

    var body2;

    bot.dialog('FunctionA', [
        function (session) {
            session.sendTyping();
            builder.Prompts.text(session, "Please key-in your App ID:");
    },
    function (session, results) {
        session.userData.AppID= results.response;
         var options = {
      url: 'APIXYZ.COM',
      headers: {
          'Content-Type' : 'application/json'               
            },
         body: JSON.stringify({"appID": session.userData.AppID})

        };

        request.post(options, function(error, response, body) {
          if (!error && response.statusCode == 200) {
            console.log(body); //logs okay
            session.userData.infoA = body;
        console.log(session.userData.infoA) //logs okay
        body2 = body;
            console.log (body2) // logs ok
        var bodyvar = body;
            console.log (bodyvar) //logs ok

          } else {
              console.log("Error: " + error);
              console.log("Status Code: " + response.statusCode);
          }
        });

        var msg = new builder.Message(session)

        .text("The body is:" + session.userData.infoA) //outputs "The body is undefined", if body2,bodyvar -> empty
        .suggestedActions(
            builder.SuggestedActions.create(
                session, [

                    builder.CardAction.imBack(session, "Ok", "Ok")
                    builder.CardAction.imBack(session, "No", "No")

                ]
            ));
    session.send(msg).endDialog();

    }]).triggerAction({ matches: /^ABC/i });

Похоже, что он работает только внутри блока запроса, и я не могу использовать его вне этого.Он регистрируется как неопределенный при использовании вне его.Я хотел бы иметь возможность сохранять тело запроса POST как переменную, чтобы я мог использовать их вне этого диалога, а также сохранить его в базе данных.

Спасибо!

Редактировать:

Я объявил body2 как переменную вне диалогового окна и блока запроса, и использовал переменную в том же диалоговом окне сразу после request.post

var msg = new builder.Message(session)

.text("The body contains: " + body2 + " .") 
        .suggestedActions(
            builder.SuggestedActions.create(
                session, [

                    builder.CardAction.imBack(session, "Ok", "Ok")
                    builder.CardAction.imBack(session, "No", "No")

                ]
            ));

Это выводит The body contains: undefined .

Я также пытался использовать его в другом диалоговом окне:

bot.dialog('Validation', function (session) {
    console.log(body2);
   session.send("The content is : " + body2 +" xx");
    if (body2== "ABC")
    {
        session.sendTyping();
        var msg = new builder.Message(session);
[.......]

В результате появляется приглашение "Oops. Something went wrong and we need to start over"

1 Ответ

0 голосов
/ 28 февраля 2019

Проблема в том, что ваш запрос post не завершается до выполнения других функций.Другими словами, вот что делает ваш код:

  1. Создает post запрос
  2. Выполняет код с body2 все еще неопределенным
  3. post запрос завершени затем определяет body2 как body

Это можно исправить двумя способами:

Использовать async / await

Thisв основном заставляет весь ваш код ждать request.post, чтобы вернуть данные, прежде чем продолжить.Если вы не знакомы, async/await - это более новый способ использования Promises или .then().Это супер полезно, особенно при выполнении HTTP-запросов.Вы можете читать больше здесь .

Добавить async

async function (session, results) {
    session.userData.AppID= results.response;
    var options = {
        url: 'APIXYZ.COM',
...

Добавить await

await request.post(options, function(error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body); //logs okay
    session.userData.infoA = body;

Инкапсулировать код в функции вашего запроса

Поскольку request.post будет выполнять код, когда он имеет error, response и body, вы можете включить любой код, который должен использовать возвращаемые данные, как это:

request.post(options, function(error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body); //logs okay
        body2 = body;
        console.log (body2) // logs ok
        var msg = new builder.Message(session)
            .text("The body is:" + body2)
            .suggestedActions(
                builder.SuggestedActions.create(
                    session, [

                        builder.CardAction.imBack(session, "Ok", "Ok"),
                        builder.CardAction.imBack(session, "No", "No")

                    ]
                ));
        session.send(msg).endDialog();
    } else {
        console.log("Error: " + error);
        console.log("Status Code: " + response.statusCode);
    }
});

Я рекомендую идти по маршруту async/await по двум причинам:

  1. Это очень полезно во многих сценариях JavaScript и очень полезно знать
  2. Если вы используетеbody2 в других диалогах, вам все равно придется его использовать.При использовании описанного выше метода «инкапсуляции» вы все еще можете ожидать ответа, пока запускается другое диалоговое окно, для которого требуется body2

При всем этом, похоже, вы используете V3 ботаФреймворк.Если это новый бот, я рекомендую встроить его в V4 - он имеет более новые функции, и мы лучше его поддерживаем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...