server.js 2.3 KB

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