2016-04-30 18 views
-1

私はMEAN STACKアプリケーションで作業しています。メールのパラメータを動的に設定したいと考えています。javasctipt - 戻り値の非同期問題

route.js

var Helper = require("../helper.js"); 
router 
    .route("/api/user/registration") 
    .POST(function (req, res) { 
     //after user insert send mail 
     Helper.sendCustomEmail(params, function (error, response) { 
      if (error) { 
       console.log("Mail : " + error); 
       res.json({"status": 0, "error": {"other": "Oops! something went wrong, please try again later"}}); 
      } else { 
       console.log("Message sent"); 
       res.json({status: 1, message: 'Thank you for registration. You will get verification email soon', token: res.locals.user.jwttoken}); 
      } 
     }); 

    }); 

Helper.js

exports.sendCustomEmail = function(params, callback) { 
    //Include nodejs mailer and smtp module 
    var nodemailer = require('nodemailer'); 
    var smtpTransport = require('nodemailer-smtp-transport'); 
    //read header email template 
    var headerHtml = params.fs.readFileSync(basePath + "emailHeader.html").toString(); 
    //read footer email template 
    var footerHtml = params.fs.readFileSync(basePath + "emailFooter.html").toString(); 
    //Your dynamic template html only 
    var dynamicMessage = params.message; 
    var message = headerHtml + dynamicMessage + footerHtml; 
    message = message.replace(/##DOMAIN_URL##/g, "http://" + params.domainUrl); 
    // create reusable transporter object using the default SMTP transport 
    var transporter = nodemailer.createTransport(smtpTransport({ 
     host: this.getSiteSetting("SMTP_HOST"), 
     secure: true, 
     auth: { 
      user: this.getSiteSetting("SMTP_USER"), 
      pass: this.getSiteSetting("SMTP_PSSSWORD") 
     }, 
     tls: { 
      rejectUnauthorized: false 
     } 
    })); 
    transporter.sendMail({ 
     from: this.getSiteSetting("SMTP_FROM"), 
     to: params.to, // receiver 
     subject: params.subject, 
     html: message // body 
    }, function(error, response) { //callback 
     callback(error, response); 
    }); 
}; 


var SiteSetting = require('../models/siteSetting'); 
exports.getSiteSetting = function($keyword) { 
    if ($keyword !== undefined && $keyword !== null && $keyword !== "") { 
     SiteSetting.findOne({setting_key : $keyword},function(err,siteSetting){ 
      if(err){ 
       return null; 
      }else{ 
       if(siteSetting !== null){ 
        console.log(siteSetting.setting_value); 
        return siteSetting.setting_value; 
       } 
      } 
     }); 
    }else{ 
     return null; 
    } 
}; 

依存性

"express" => "version": "4.13.4", 
"mongoose" => "version": "4.4.4", 
"mongodb" => "version": "2.4.9", 
"OS" => "ubuntu 14.04 lts 32bit", 

以下のコードSiteSetting機能console.logは正しく出力されますが、返信メール送信エラーが発生する前に発生します。 このコードの適切なガイドラインを教えてください。

+1

いいえ、何トンもの任意のコードで、出力もエラーログもありません。 –

答えて

1

これは以下のように解決できます。

exports.sendCustomEmail = function(params, callback) { 
    //Include nodejs mailer and smtp module 
    var nodemailer = require('nodemailer'); 
    var smtpTransport = require('nodemailer-smtp-transport'); 
    //read header email template 
    var headerHtml = fs.readFileSync(basePath + "app/client/views/layout/emailTemplates/emailHeader.html").toString(); 
    //read footer email template 
    var footerHtml = fs.readFileSync(basePath + "app/client/views/layout/emailTemplates/emailFooter.html").toString(); 
    //Your dynamic template html only 
    var dynamicMessage = params.message; 
    var message = headerHtml + dynamicMessage + footerHtml; 
    message = message.replace(/##DOMAIN_URL##/g, "http://" + params.domainUrl); 


    var host = null; 
    var user = null; 
    var pass = null; 
    var from = null; 

    this.getSiteSetting("SMTP_HOST", function(res) { 
     host = res; 
     setParams(); 
    }); 
    this.getSiteSetting("SMTP_USER", function(res) { 
     user = res; 
     setParams(); 
    }); 
    this.getSiteSetting("SMTP_PASS", function(res) { 
     pass = res; 
     setParams(); 
    }); 
    this.getSiteSetting("MAIL_FROM", function(res) { 
     from = res; 
     setParams(); 
    }); 

    var setParams = function() { 
     if (host !== null && user !== null && pass !== null && from !== null) { 
      // create reusable transporter object using the default SMTP transport 
      var transporter = nodemailer.createTransport(smtpTransport({ 
       host: host, 
       //port: 25, 
       //port: 465, 
       secure: true, 
       auth: { 
        user: user, 
        pass: pass 
       }, 
       tls: { 
        rejectUnauthorized: false 
       } 
      })); 

      transporter.sendMail({ 
       from: from, 
       to: params.to, // receiver 
       subject: params.subject, 
       html: message // body 
      }, function(error, response) { //callback 
       callback(error, response); 
      }); 
     } 
    }; 
} 

var SiteSetting = require('../models/siteSetting'); 
exports.getSiteSetting = function(keyword, callback) { 
    if (keyword !== undefined && keyword !== null && keyword !== "") { 
     SiteSetting.findOne({ setting_key: keyword }, function(err, siteSetting) { 
      if (err) { 
       callback(null); 
      } else { 
       if (siteSetting !== null) { 
        //console.log(siteSetting.setting_value); 
        callback(siteSetting.setting_value); 
       }else{ 
        callback(null); 
       } 
      } 
     }); 
    } else { 
     callback(null); 
    } 
};