javasctipt-返回值的异步问题

javasctipt - asynchronous issue for return value

本文关键字:问题 异步 返回值 javasctipt-      更新时间:2023-09-26

我在MEAN STACK应用程序中工作,我想动态设置邮件的参数。

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正确打印,但在发生返回邮件发送错误之前。请给我一个合适的准则。

这可以如下解决。

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