server.js 2.1 KB

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