Created
April 29, 2015 10:26
-
-
Save jmkelly/fbcefb51a7642b21f36a to your computer and use it in GitHub Desktop.
express.js and socket.io push api
This file contains hidden or 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 express = require('express'); | |
var hbs = require('express3-handlebars'); | |
var bodyParser = require('body-parser'); | |
var logger = require('morgan'); | |
var moment = require('moment'); | |
var pg = require('pg'); | |
var port = 3333; | |
var app = express(); | |
var env = process.env.NODE_ENV || 'development' | |
if (env == 'development') { | |
connectionString = "postgres://username@localhost/dev_database" | |
} else { | |
connectionString = "postgres://username@localhost/production_database" | |
} | |
client = new pg.Client(connectionString); | |
client.connect(); | |
app.use(logger()); | |
app.use(bodyParser()); | |
app.set('views', __dirname + '/views'); | |
app.set('view engine', 'handlebars'); | |
app.engine('handlebars', hbs({defaultLayout: app.get('views') + '/layouts/index'})); | |
var last_day_query = "select extract(epoch from date_trunc('minute', created_at)) as created_at, avg(temperature) as temperature, " + | |
"avg(humidity) as humidity " + | |
"from readings " + | |
"where created_at between " + | |
"(CURRENT_TIMESTAMP AT TIME ZONE 'UTC' - INTERVAL '1 day') " + | |
"and " + | |
"(CURRENT_TIMESTAMP AT TIME ZONE 'UTC') " + | |
"group by date_trunc('minute', created_at) " + | |
"order by date_trunc('minute', created_at) " + | |
"limit 1000; "; | |
var last_hour_query = "select extract(epoch from created_at) as created_at, temperature, humidity from " + | |
"readings " + | |
"where created_at between " + | |
"(CURRENT_TIMESTAMP AT TIME ZONE 'UTC' - INTERVAL '1 hour') " + | |
"and " + | |
"(CURRENT_TIMESTAMP AT TIME ZONE 'UTC') limit 1000;"; | |
var last_year_query = "select extract(epoch from date_trunc('minute', created_at)) as created_at, avg(temperature) as temperature, " + | |
"avg(humidity) as humidity " + | |
"from readings " + | |
"where created_at between " + | |
"(CURRENT_TIMESTAMP AT TIME ZONE 'UTC' - INTERVAL '1 year') " + | |
"and " + | |
"(CURRENT_TIMESTAMP AT TIME ZONE 'UTC') " + | |
"group by date_trunc('minute', created_at) " + | |
"order by date_trunc('minute', created_at) asc"; | |
var server = app.listen(port, function () { | |
console.log('Listening on port %d', server.address().port); | |
}); | |
var io = require('socket.io').listen(server); | |
app.get('/', function (req, res) { | |
query = client.query('SELECT temperature, humidity, created_at from readings order by created_at desc limit 1'); | |
query.on('row', function(result) { | |
result.temperature = parseFloat(result.temperature).toFixed(1); | |
result.humidity = parseFloat(result.humidity).toFixed(1); | |
result.last_refresh = result.created_at.toISOString(); | |
console.log(result.last_refresh); | |
res.render('home', result); | |
}); | |
}); | |
app.post('/reading', function (req, res) { | |
reading = req.body | |
client.query('INSERT INTO readings(id, temperature, humidity, created_at, updated_at) values ($1, $2, $3, $4, $5)',[reading.id, reading.temperature, reading.humidity, reading.created_at, moment.utc()]); | |
reading.temperature = parseFloat(reading.temperature).toFixed(1); | |
reading.humidity = parseFloat(reading.humidity).toFixed(1); | |
reading.last_refresh = reading.created_at; | |
io.sockets.emit('reading', reading); | |
res.send(200); | |
}); | |
app.get('/readings', function (req, res) { | |
var qry = client.query(last_year_query); | |
qry.on('row', function (row, result) { | |
result.addRow(row); | |
}); | |
qry.on('end', function(result) { | |
res.json(result.rows); | |
}); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment