Promisify Nodemailer 与 bluebird?

fan*_*ats 5 javascript node.js promise nodemailer bluebird

Nodemailer作者已明确表示他不支持承诺。我想我应该尝试使用 bluebird,但我的尝试似乎没有捕获 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({...});
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我通过这样做来调用它:

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

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

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({...});
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,我的蓝鸟承诺并未捕获节点邮件程序错误。我做错了什么?

小智 3

无法从我的头脑中说出代码有什么问题。我在承诺方面遇到了类似的问题,并决定手动承诺问题案例会更容易。这不是最优雅的解决方案,但它是一个解决方案。

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)
            });
        });
    }
}
Run Code Online (Sandbox Code Playgroud)