将方法转换为承诺:Nodejs

Convert a method into a promise : Nodejs

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

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

nodeMailer.sendEmail().then(function ...
TypeError: Cannot read property 'then' of undefined.

我理解这是因为我的方法没有 return 承诺。我不确定如何在保留其原始功能的同时将此方法写入 return 承诺。

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();

根据 nodemailer docs,如果您在 sendMail 调用中省略回调,它将 return 一个 Promise。所以只是 return 那。

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