Skip to content

Instantly share code, notes, and snippets.

@jmkelly
Created April 29, 2015 10:26
Show Gist options
  • Save jmkelly/fbcefb51a7642b21f36a to your computer and use it in GitHub Desktop.
Save jmkelly/fbcefb51a7642b21f36a to your computer and use it in GitHub Desktop.
express.js and socket.io push api
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