#node.js #dialogflow-es
# #node.js #диалоговые потоки
Вопрос:
Я пытаюсь отправить кому-то электронное письмо. Я печатаю сообщение об успешном завершении в консоли, и мой код работает хорошо и успешно отправляет электронное письмо, но когда я печатаю его в агенте в виде сообщения, оно отображается недоступным до ответа. Вот мой код:
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:
Проблема в том, что вы выполняете асинхронные функции (ваши вызовы getEmail()
и createMessage()
), используя обещания, но вы не возвращаете обещание от sendEmail()
самого себя.
Библиотека Dialogflow требует, чтобы, если вы выполняете асинхронные функции, вы возвращали обещание, чтобы диспетчер обработчика намерений знал, что вы выполняете асинхронные функции.
В вашем случае самый простой способ сделать это — просто вернуть обещание из getEmail().then()
цепочки. Так что изменение строки, подобное этому, должно сработать:
return getEmail(agent.parameters.name).then(function(){