postgresql-app.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /**
  2. * Module dependencies.
  3. */
  4. const cluster = require('cluster'),
  5. numCPUs = require('os').cpus().length,
  6. express = require('express'),
  7. pgp = require('pg-promise')(),
  8. helper = require('./helper');
  9. // Middleware
  10. const bodyParser = require('body-parser');
  11. const connection = {
  12. db: 'hello_world',
  13. username: 'benchmarkdbuser',
  14. password: 'benchmarkdbpass',
  15. host: 'tfb-database',
  16. dialect: 'postgres'
  17. }
  18. const db = pgp(`postgres://${connection.username}:${connection.password}@${connection.host}:5432/${connection.db}`);
  19. if (cluster.isMaster) {
  20. // Fork workers.
  21. for (let i = 0; i < numCPUs; i++) {
  22. cluster.fork();
  23. }
  24. cluster.on('exit', (worker, code, signal) =>
  25. console.log('worker ' + worker.pid + ' died'));
  26. } else {
  27. const app = module.exports = express();
  28. app.set('view engine', 'pug');
  29. app.set('views', __dirname + '/views');
  30. app.use(bodyParser.urlencoded({ extended: true }));
  31. app.use(bodyParser.json());
  32. // Set headers for all routes
  33. app.use((req, res, next) => {
  34. res.setHeader("Server", "Express");
  35. return next();
  36. });
  37. // Routes
  38. app.get('/db', async (req, res) => {
  39. let world = await getRandomWorld();
  40. res.setHeader("Content-Type", "application/json");
  41. res.json(world);
  42. });
  43. app.get('/queries', async (req, res) => {
  44. const results = [],
  45. queries = Math.min(parseInt(req.query.queries) || 1, 500);
  46. for (let i = 0; i < queries; i++) {
  47. results.push(await getRandomWorld());
  48. }
  49. res.json(results)
  50. });
  51. app.get('/fortunes', async (req, res) => {
  52. let fortunes = await getAllFortunes()
  53. const newFortune = { id: 0, message: "Additional fortune added at request time." };
  54. fortunes.push(newFortune);
  55. fortunes.sort((a, b) => (a.message < b.message) ? -1 : 1);
  56. res.render('fortunes/index', { fortunes: fortunes });
  57. });
  58. app.get('/updates', async (req, res) => {
  59. const results = [],
  60. queries = Math.min(parseInt(req.query.queries) || 1, 500);
  61. for (let i = 1; i <= queries; i++) {
  62. results.push(await updateRandomWorld())
  63. }
  64. res.json(results);
  65. });
  66. const getRandomWorld = async () => {
  67. return await db.one(`select * from world where id = ${helper.randomizeNum()}`, [true])
  68. };
  69. const updateRandomWorld = async () => {
  70. return await db.oneOrNone(`update world set randomNumber = ${helper.randomizeNum()} where id = ${helper.randomizeNum()} returning id, randomNumber`, [true])
  71. };
  72. const getAllFortunes = async () => {
  73. return await db.many('select * from fortune', [true]);
  74. };
  75. app.listen(8080, () => {
  76. console.log('listening on port 8080');
  77. });
  78. }