用蓝鸟提升Nodemailer?

nodemailer作者明确表示他不支持promise。 我以为我会尝试使用蓝鸟,但我的尝试似乎没有捕获任何错误,Nodemailer抛出:

var nodemailer = require('nodemailer'); var Promise = require('bluebird'); // build the transport with promises var transport = Promise.promisifyAll( nodemailer.createTransport({...}) ); module.exports = { doit = function() { // Use bluebird Async return transport.sendMailAsync({...}); } } 

然后我这样做:

 doit().then(function() { console.log("success!"); }).catch(function(err) { console.log("There has been an error"); }); 

但是,当提供无效的电子邮件时,我看到:

 Unhandled rejection Error: Can't send mail - all recipients were rejected 

所以,nodemailer错误没有被我的蓝鸟承诺所捕获。 我做错了什么?

不能说我的头顶上的代码有什么问题。 我遇到了Promisification类似的问题,并决定只是手动提交问题案例比较容易。 这不是最优雅的解决scheme,但它是一个解决scheme。

 var transport = nodemailer.createTransport({...}); module.exports = { doit: function() { return new Promise(function (res, rej) { transport.sendMail({...}, function cb(err, data) { if(err) rej(err) else res(data) }); }); } } 

你可以尝试使用.fromNode()创build即时Promise吗?

 var nodemailer = require('nodemailer'); var Promise = require('bluebird'); module.exports = { doit = function() { return Promise.fromNode(function(callback) { transport.sendMail({...}), callback); } } } 

doit()将返回蓝鸟许诺。 你可以在这里find.fromNode()的文档。

这是如何得到它的工作(打字稿,蓝鸟的诺言,nodemailer-smtp传输):

 export const SendEmail = (from:string, to:string[], subject:string, text:string, html:string) => { const transportOptions = smtpConfiguration; // Defined elsewhere const transporter = nodemailer.createTransport(smtpTransport(transportOptions)); const emailOptions = { from: from, to: to.join(','), subject: subject, text: text, html: html }; return new Promise((resolve, reject) => { transporter.sendMail(emailOptions, (err, data) => { if (err) { return reject(err); } else { return resolve(data); } }); }); };