Created
March 2, 2013 00:43
-
-
Save niallo/5069072 to your computer and use it in GitHub Desktop.
Quick and dirty landing page & contact form server in node.js, uses hapi.js, swig and nodemailer.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var mailer = require('nodemailer') | |
var Hapi = require('hapi') | |
var util = require('util') | |
var template = require('swig') | |
var path = require('path') | |
var PORT = process.env.PORT || 8080 | |
var server = new Hapi.Server(PORT) | |
template.init({ | |
root : path.resolve('./templates') | |
, cache: process.env.NODE_ENV === 'production' | |
}) | |
var pages = { | |
'/' : 'index.html' | |
, '/node' : 'node.html' | |
, '/full-stack' : 'full-stack.html' | |
, '/open-source' : 'open-source.html' | |
, '/databases' : 'databases.html' | |
, '/testing-continuous-deployment' : 'testing-continuous-deployment.html' | |
, '/web' : 'web.html' | |
} | |
// If production, compilation of templates once. | |
if (process.env.NODE_ENV === 'production') { | |
for (var k in pages) { | |
pages[k] = template.compileFile(pages[k]).render({}) | |
} | |
} | |
var emailConfig = { | |
service: "Mailgun", | |
auth: { | |
user: "foo", | |
pass: "bar", | |
} | |
} | |
// Send leads to this address | |
var emailDestination = "[email protected]" | |
var emailTransport = mailer.createTransport("SMTP", emailConfig) | |
for (var k in pages){ | |
server.route({ | |
method : "GET" | |
, path: k | |
, handler : (function(url){ | |
return function(r){ | |
// Regenerate template on each request if NODE_ENV != "production" | |
// Nodejitsu sets NODE_ENV="production" by default | |
var resp = pages[url] | |
if (process.env.NODE_ENV !== 'production') { | |
resp = template.compileFile(pages[url]).render({}) | |
} | |
r.reply(resp) | |
} | |
})(k) | |
}) | |
} | |
// Serve static files from `static` dir. | |
server.route({ | |
method: 'GET', | |
path: '/{path*}', | |
handler: { | |
directory: { path: './static', listing: false, index: true } | |
} | |
}) | |
function emailTemplate(opts) { | |
var text = "Hi! Hope you are having a great day. " | |
text += "Wanted to let you know someone just submitted a contact request on example.com:" | |
text += "\n\nname: %s\nphone: %s\nemail: %s\nmessage: %s\n" | |
text += "\n\nBest,\n -example.com Website" | |
return util.format(text, opts.fullName, opts.phone, opts.email, opts.message) | |
} | |
// Handler for /api/contact AJAX endpoint | |
var contact = { | |
handler: function (request) { | |
var envelope = { | |
from: "Example Website <[email protected]>", | |
to: emailDestination, | |
subject: "Example.com Contact", | |
text:emailTemplate(request.payload) | |
} | |
emailTransport.sendMail(envelope) | |
request.reply({ status: 'ok', errors: [], result: {}}) | |
}, | |
validate: { | |
schema: { | |
fullName: Hapi.Types.String().required(), | |
phone: Hapi.Types.String().required(), | |
email: Hapi.Types.String().email().required(), | |
message: Hapi.Types.String(), | |
} | |
} | |
} | |
server.route({ | |
method: 'POST', | |
path: '/api/contact', | |
config: contact | |
}) | |
server.start() | |
console.log("Example.com website on http://localhost:%s", PORT) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment