将路由处理程序委派给NodeJS + Express中的其他模块

时间:2015-03-22 19:35:51

标签: javascript node.js mongodb express

我一直试图避免在routes.js文件中产生开销。

在这里:

module.exports = function(app, db) {
app.get('/', function(req, res) {
    res.render('index')
});

app.get('/contact-us', function(req, res) {
    var col = db.collection('contacts');

    var transporter = nodemailer.createTransport({
        service: 'Gmail',
        auth: {
            user: 'gmail.user@gmail.com',
            pass: 'userpass'
        }
    });
});
});
}

正如您所看到的,只是通过实例化mongo集合和邮件传输器,业务逻辑已经充斥着这种情况。我无法找到有关如何将此逻辑委托给外部模块的任何材料,例如sendmail.js,savetomongo.js等。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我做了一些修改。我已根据您的要求更新了。 你需要根据实际需要来制作它。

var sendmail = require('./sendmail.js');
var savetomongo = require('./savetomongo.js');
module.exports = function(app, db) {
    app.get('/', function(req, res) {
        res.render('index')
    });

    app.get('/contact-us', function(req, res) {
        var col = db.collection('contacts');
        var document = {'id': 'xyz'};
        savetomongo.save(col, document, function(error, is_save) {
            if (error) {
                //handle error
            } else {
                // next()
                sendmail.sendEmail('DUMMY <from@xyz.com>', 'to@xyz.com', 'TestEmail', 'Only for testing purpose', function(error, isSend) {
                    if (error) {
                        //handle error
                    } else {
                        // next() 
                        //res.render('index')
                    }
                });
            }
        });

    });
}

// sendmail.js

module.exports = {
    sendEmail: function(fromEmailFormatted, toEmail, subject, message, fn) {
        var mailOptions = {
            from: fromEmailFormatted, // sender address
            to: toEmail, // list of receivers
            subject: subject, // Subject line
            html: message // html body
        };
        var transporter = nodemailer.createTransport({
            service: 'Gmail',
            auth: {
                user: 'gmail.user@gmail.com',
                pass: 'userpass'
            }
        });
        // send mail with defined transport object
        transporter.sendMail(mailOptions, function(error, info) {
            if (error) {
                return fn(error);
            } else {
                return fn(null, true);
            }
        });
    }
}

// savetomongo.js

module.exports = {
    save: function(col, data, fn) {
        col.insert(data, {w: 1}, function(err, records) {
            if (err) {
                return fn(err);
            } else {
                return fn(null, records);
            }
        });
    }
}