将方法转换为promise:Nodejs

时间:2016-05-17 06:16:49

标签: javascript node.js promise nodemailer

我有以下要调用的Nodejs方法并执行.then函数。我不确定如何编写此方法,以便我可以使用.then()方法。

我在sendEmail中使用nodemailer.js方法,我想在app.js中调用并执行.then()方法。它目前给我错误:

  

nodeMailer.sendEmail()。then(function ...
  TypeError:无法读取未定义的属性'then'。

我理解这是因为我的方法没有返回承诺。我不确定如何编写此方法以在保留其原始功能时返回承诺。

nodemailer.js

var nodemailer = require('nodemailer');

var transporter = nodemailer.createTransport('smtps://********');   
var mytext="my new text";

var mailOptions ={
    from: '"Reviews"<Reviews@reviews.com>', // sender address
    to: 'Someone@something.com', // list of receivers
    subject: 'Test', // Subject line
    text: '', // plaintext body
    }

module.exports = {
    mailOptions:mailOptions,
    sendEmail: function() {
        transporter.sendMail(mailOptions, function(error, info) {
            if (error) {
                    console.log(error);
               } else {
                    console.log('Message sent: ' + info.response);
               }
        })
    }
}

app.js中调用上述内容会出现上述错误

app.js

var nodeMailer = require('./nodeMailer')
var cron = require('cron');

var cronJob1 = cron.job("*/30 * * * * *", function(){
    Model.find(query,function (err, results) {
        if (err) {
            res.status(500).json({ message: 'Something Broke!' });
        } else {
            nodeMailer.mailOptions.text =  JSON.stringify(results);
            nodeMailer.sendEmail().then(function(){
                Model.findAndUpdate(query,  { $set: { "email": true }}, 
                    function(err, resp){
                        console.log(resp, "successfully updated")
                    })
            });
        }
    });
}); 
cronJob1.start();

1 个答案:

答案 0 :(得分:4)

根据nodemailer docs,如果您在sendMail来电中省略了回调,则会返回Promise。所以回过头来。

sendEmail: function() { 
  return transporter.sendMail(mailOptions)
  .then(
    function(info) { 
      console.log('Message sent: ' + info.response); 
    },
    function(error){
      console.log(error); 
    }
  );
}