Dialogflow Fulfillment 0.6.1版本下Nodemailer运行崩溃如何解决?
问题原因
故障核心是dialogflow-fulfillment 0.6.x版本的机制变更,和异步操作的处理逻辑直接相关。
两个版本核心差异
- 0.5.0版本:未对意图处理函数做异步返回强制要求,即使函数内部有异步任务未完成,框架会默认等待所有事件循环清空后再返回响应,因此你的回调式Nodemailer调用可以正常执行完成。
- 0.6.1版本:重构了请求处理逻辑,
agent.handleRequest会强制要求异步处理函数返回Promise,否则会在处理函数的同步代码执行完成后立刻返回响应,终止云函数实例运行。你的sendMail是异步IO操作,还没执行完就被云函数提前回收进程,直接触发崩溃。
修复方案
修改sendEmail处理函数,使用Nodemailer的Promise API并返回异步操作的Promise即可,修改后的代码如下:
function sendEmail(agent){ const email = agent.parameters.email; const name = agent.parameters.name; const cls = agent.parameters.cls; const message = agent.parameters.message; const mailOptions = { from: 'SENDER EMAIL', to: 'EMAIL', cc: email, subject: "ABC", text: "MESSAGE:" + '\n\n Name: ' + name + '\n\n Class: ' + cls + '\n\n Email: ' + email + '\n\n Message: ' + message }; // 改用Promise写法并返回,告知框架等待异步操作完成 return transporter.sendMail(mailOptions) .then(info => { console.log('Email sent: ' + info.response); // 可自定义正常返回给用户的提示 agent.add('你的咨询已经提交成功,我们会尽快回复你'); }) .catch(error => { console.log(error); // 可自定义异常返回给用户的提示 agent.add('提交失败,请稍后重试'); }); }
额外说明
不需要新增其他适配代码,只要确保所有包含异步操作的意图处理函数都返回对应Promise即可适配0.6.1版本。
内容的提问来源于stack exchange,提问作者user15458141
相关产品推荐
相关产品推荐

