как сделать почтовый запрос внутри асинхронной функции? - PullRequest
0 голосов
/ 08 октября 2019

В конце диалогового окна «водопад» в «сводке» (т. Е. В последнем операторе if) я хочу автоматически сделать запрос на публикацию без вызова API в Postman, является ли EventListener подходом? Как это включить?

async summaryStep(step) {
            if (step.result) {
                // Get the current profile object from user state.
                const userProfile = await this.userProfile.get(step.context, new UserProfile());
                userProfile.name = step.values.name;
                //the same for other step values(email, doctor, date)
                let msg = `you want a date with dr. ${userProfile.doctor} , and your name is ${userProfile.name}.`;
                if (userProfile.date !== -1) {
                    msg += `you have an appointment the:  ${userProfile.date}.`;
                }
                await step.context.sendActivity(msg);
                let msg1 = `"${userProfile.date}"`;
                if (msg1) {
                    let z = JSON.stringify(userProfile.name);
                    //and also the other rows to go in the database(email, doctor, date)
                    var name = JSON.parse(z);
                    //and also the other rows to go in the database(email, doctor, date)
                    //this actually works but only if i use postman 
                    var urlencoded = bodyparser.urlencoded({ extended: false });
                    app.post('/id', urlencoded, (req, res) => {
                        app.use(express.json());
                        app.use(express.urlencoded({ extended: true }));
                        mysqlConnection.query("INSERT INTO users(name, email, doctor, date) VALUES('" + userProfile.name + "','" + userProfile.password + "','" + userProfile.doctor + "','" + userProfile.date + "')", function (err, result, rows) {
                            if (err) throw err;
                            console.log("Yeah! record inserted");
                            console.log(name);
                            res.send(result);
                        });
                    });
                    const port = process.env.PORT || 8080;
                    app.listen(port, () => console.log(`Listening on port ${port}..`));
                }

            } else {
                await step.context.sendActivity('Thanks. Your profile will not be kept. Push enter to return Menu');
            }
            return await step.prompt(CONFIRM_PROMPT3, `is that true? ${step.result}`, ['yes', 'no']);
// this if statement should "fire" the post request...
            if (step.result == 'yes') {
                return await step.context.sendActivity(`we will contact you soon ${userProfile.password}.`);
            }
            return await step.endDialog();
        }

enter image description here

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Ответ - переместить вашу конечную точку API app.post в файл index.js, где ваш бот уже работает на сервере. Просто раскрутите новый «сервер» и «порт», чтобы сделать конечную точку доступной. Затем в вашем summaryStep (axiosStep в моем примере) сделайте вызов API, используя Axios, запрос-обещание или что у вас есть, для публикации ваших данных. При обращении к API данные передаются и обрабатываются.

В приведенном ниже коде при обращении к API переданные данные используются в sendActivity, отправленном обратно в бот. В вашем случае ваши переданные данные будут использоваться для вызова базы данных, в котором вы можете использовать возвращенный ответ в sendActivity.

. Ваш код будет выглядеть примерно так:Обратите внимание, что действия post упрощены для примера. Вам необходимо обновить действия публикации, чтобы выполнять запросы mySql. В этом примере также используется restify для сервера (стандартно для ботов Bot Framework) и используется тот же порт, что и у бота, но его можно легко обновить, чтобы использовать Express и / или другой порт.

Надежда на помощь!

index.js

[...]

const conversationReferences = {};
const bodyParser = require('body-parser');

server.post('/id', async (req, res) => {
  const { conversationID, data, name } = req.body;
  const conversationReference = conversationReferences[ conversationID ];

  await adapter.continueConversation(conversationReference, async turnContext => {
    var reply = `${ data }. Thanks, ${ name }`;

    await turnContext.sendActivity(reply);
  });
  res.writeHead(200);
  res.end();
});

mainDialog.js

async axiosStep ( stepContext ) {
  const conversationID = stepContext.context.activity.conversation.id;
  try {
    const response = await axios.post(`http://localhost:3978/id`, {
      data: "Yeah! Record inserted",
      name: "Steve",
      conversationID: conversationID
    })
    console.log(response);
  } catch (error) {
    console.log(error);
  }
  return stepContext.next();
}

enter image description here

enter image description here

enter image description here

1 голос
/ 09 октября 2019

Насколько я понимаю, вы хотите знать, как вызывать POST API из асинхронной функции бота Azure. Пожалуйста, попробуйте код ниже в вашей функции async summaryStep, чтобы отправить запрос по почте в соответствии с вашими требованиями.

var rp = require('request-promise');

var options = {
  method: 'POST',
  uri: 'http://localhost:8080/id',
  body: {
    fieldCount:0,
    affectedRows:1,
    //your other body content here...
  },
  json: true,
  headers: {
    'content-type': 'application/json'  //you can append other headers here 
  }
};

await rp(options)
    .then(function (body) {
        console.log(body)
    })
    .catch(function (err) {
      console.log(err)
    });
}

Надеюсь, это поможет. И если есть какие-либо дополнительные проблемы или неправильное понимание, пожалуйста, дайте мне знать.

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