получение ответа на консоли без ответа на agent.add () - PullRequest
1 голос
/ 17 апреля 2019

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

function sendEmail(agent){
//get email and name and message and subject

  console.log("Email befor getting: " +fetchedEmail);
  getEmail(agent.parameters.name).then(function(){
    console.log("the email is fetched: "+fetchedEmail);

    const nodemailer = require('nodemailer');
    const transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        user: '*********@gmail.com',
        pass: '*******************'
      }
    });
    var mailOptions = {
      from: '*******@gmail.com',
      to: fetchedEmail, //receiver email 
      subject: agent.parameters.subject,
      text: agent.parameters.message
    };


    return createMessage(mailOptions,transporter).then(()=>{
      console.log("email sent successfully");//this message printed on console
      agent.add(`email sent successfully`);// this not printed in agent

    }).catch(()=>{
      agent.add(`fail`);
    });




  });
}// end of send email

function createMessage(mailOptions,transporter){
return new Promise((resolve,reject)=>{
  // i promise to send email
  transporter.sendMail(mailOptions, function (error, info) {
        if (error) {
          console.log("there is error");
          reject(error);
        } else {
          console.log("success");// printed on console
          resolve('Email sent: ' + info.response);
        }
      });



});


}//end of create message
//---

1 Ответ

0 голосов
/ 17 апреля 2019

Проблема в том, что вы выполняете асинхронные функции (ваши вызовы getEmail() и createMessage()) с помощью Promises, но вы не возвращаете Promise от самого sendEmail().

Библиотека Dialogflowтребует, чтобы, если вы выполняете асинхронные функции, вы возвращали Promise, чтобы диспетчер Intent Handler знал, что вы выполняете асинхронные функции.

В вашем случае самый простой способ сделать это - просто вернуть Promiseиз цепочки getEmail().then().Таким образом, изменение строки должно работать следующим образом:

return getEmail(agent.parameters.name).then(function(){
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...