server.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. var express = require('express'),
  2. async = require('async'),
  3. pg = require("pg"),
  4. path = require("path"),
  5. cookieParser = require('cookie-parser'),
  6. bodyParser = require('body-parser'),
  7. methodOverride = require('method-override'),
  8. app = express(),
  9. server = require('http').Server(app),
  10. io = require('socket.io')(server);
  11. io.set('transports', ['polling']);
  12. var port = process.env.PORT || 4000;
  13. io.sockets.on('connection', function (socket) {
  14. socket.emit('message', { text : 'Welcome!' });
  15. socket.on('subscribe', function (data) {
  16. socket.join(data.channel);
  17. });
  18. });
  19. async.retry(
  20. {times: 1000, interval: 1000},
  21. function(callback) {
  22. pg.connect('postgres://postgres@db/postgres', function(err, client, done) {
  23. if (err) {
  24. console.error("Waiting for db");
  25. }
  26. callback(err, client);
  27. });
  28. },
  29. function(err, client) {
  30. if (err) {
  31. return console.error("Giving up");
  32. }
  33. console.log("Connected to db");
  34. getVotes(client);
  35. }
  36. );
  37. function getVotes(client) {
  38. client.query('SELECT vote, COUNT(id) AS count FROM votes GROUP BY vote', [], function(err, result) {
  39. if (err) {
  40. console.error("Error performing query: " + err);
  41. } else {
  42. var votes = collectVotesFromResult(result);
  43. io.sockets.emit("scores", JSON.stringify(votes));
  44. }
  45. setTimeout(function() {getVotes(client) }, 1000);
  46. });
  47. }
  48. function collectVotesFromResult(result) {
  49. var votes = {a: 0, b: 0};
  50. result.rows.forEach(function (row) {
  51. votes[row.vote] = parseInt(row.count);
  52. });
  53. return votes;
  54. }
  55. app.use(cookieParser());
  56. app.use(bodyParser());
  57. app.use(methodOverride('X-HTTP-Method-Override'));
  58. app.use(function(req, res, next) {
  59. res.header("Access-Control-Allow-Origin", "*");
  60. res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  61. res.header("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS");
  62. next();
  63. });
  64. app.use(express.static(__dirname + '/views'));
  65. app.get('/', function (req, res) {
  66. res.sendFile(path.resolve(__dirname + '/views/index.html'));
  67. });
  68. server.listen(port, function () {
  69. var port = server.address().port;
  70. console.log('App running on port ' + port);
  71. });