2015-06-20 90 views
2

nodemailer author已經明確表示他不支持承諾。我想我會盡我的手在使用藍鳥,但我在它的企圖似乎沒有抓到任何錯誤Nodemailer拋出:用藍鳥Promisify Nodemailer?

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

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({...}); 
    } 
} 

然後我做叫它但是,當提供無效的電子郵件時,我看到:

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

因此,nodemailer錯誤未被我的藍鳥承諾捕獲。我做錯了什麼?

+1

你不向我們展示你的整個代碼 - 請再現它的一個版本 - 也 - 在未處理的拒絕錯誤是什麼? (您收到此消息的事實表明bluebird _does_看到錯誤。 –

+0

與couchbase crud方法相同的問題。 –

回答

1

不能說我的頭頂代碼有什麼問題。我遇到了promisification類似的問題,並決定只是手動提供問題案例比較容易。這不是最優雅的解決方案,但它是一個解決方案。

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) 
      }); 
     }); 
    } 
} 
0

您可以嘗試用.fromNode()創建即時創建Promise嗎?

var nodemailer = require('nodemailer'); 
var Promise = require('bluebird'); 

module.exports = { 
    doit = function() {    
     return Promise.fromNode(function(callback) { 
      transport.sendMail({...}), callback); 
     } 
    } 
} 

doit()將返回一個藍鳥的承諾。你可以找到.fromNode()here的文檔。

1

這怎麼我得到它的工作(打字稿,藍鳥的承諾,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); 
      } 
     }); 
    }); 
};