app.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. const cluster = require('cluster'),
  2. numCPUs = require('os').cpus().length;
  3. // Koa Deps
  4. const koa = require('koa'),
  5. route = require('koa-route'),
  6. handlebars = require('koa-handlebars'),
  7. bodyParser = require('koa-bodyparser'),
  8. override = require('koa-override');
  9. // Monk MongoDB Driver Deps
  10. const monk = require('monk'),
  11. wrap = require('co-monk'),
  12. db = monk('mongodb://TFB-database/hello_world'),
  13. worlds = wrap(db.get('world')),
  14. fortunes = wrap(db.get('fortune'));
  15. if (cluster.isMaster) {
  16. // Fork workers.
  17. for (let i = 0; i < numCPUs; i++) {
  18. cluster.fork();
  19. }
  20. cluster.on('exit', (worker, code, signal) =>
  21. console.log('worker ' + worker.process.pid + ' died'));
  22. } else {
  23. const app = module.exports = koa();
  24. app.use(bodyParser());
  25. app.use(override());
  26. app.use(handlebars({
  27. // needed, otherwise missing dir err
  28. partialsDir: "views"
  29. }));
  30. // routes
  31. app.use(route.get('/json', jsonHandler));
  32. app.use(route.get('/db', dbHandler));
  33. app.use(route.get('/queries', queriesHandler));
  34. app.use(route.get('/fortunes', fortuneHandler));
  35. app.use(route.get('/updates', updateHandler));
  36. app.use(route.get('/plaintext', textHandler));
  37. // Helpers
  38. const getRandomNumber = () => ~~(Math.random()*10000) + 1;
  39. const validateParam = (param) => {
  40. let numOfQueries = isNaN(param) ? 1 : param;
  41. if (numOfQueries > 500) {
  42. numOfQueries = 500;
  43. } else if (numOfQueries < 1) {
  44. numOfQueries = 1;
  45. }
  46. return numOfQueries;
  47. };
  48. // Query Helpers
  49. function *worldUpdateQuery() {
  50. const randomId = getRandomNumber();
  51. const randomNumber = getRandomNumber();
  52. const result = yield worlds.update(
  53. {id: randomId},
  54. {$set: {randomNumber: randomNumber}}
  55. );
  56. return {
  57. id: randomId,
  58. randomNumber: randomNumber
  59. }
  60. }
  61. function *worldQuery() {
  62. return yield worlds.findOne({id: getRandomNumber()}, '-_id');
  63. }
  64. function *fortunesQuery() {
  65. return yield fortunes.find({}, '-_id');
  66. }
  67. // Route handlers
  68. function *jsonHandler() {
  69. this.set('Server', 'Koa');
  70. this.body = {
  71. message: "Hello, world!"
  72. }
  73. }
  74. function *dbHandler() {
  75. this.set('Server', 'Koa');
  76. this.body = yield worldQuery;
  77. }
  78. function *queriesHandler() {
  79. this.set('Server', 'Koa');
  80. let numOfQueries = validateParam(this.query.queries);
  81. const queries = [];
  82. for (let i = 0; i < numOfQueries; i++) {
  83. queries.push(worldQuery);
  84. }
  85. this.body = yield queries;
  86. }
  87. function *fortuneHandler() {
  88. this.set('Server', 'Koa');
  89. const fortunes = yield fortunesQuery;
  90. fortunes.push({
  91. id: 0,
  92. message: 'Additional fortune added at request time.'
  93. });
  94. fortunes.sort((a, b) => (a.message < b.message) ? -1 : 1);
  95. yield this.render("fortunes", {fortunes: fortunes});
  96. }
  97. function *updateHandler() {
  98. this.set('Server', 'Koa');
  99. const numOfUpdates = validateParam(this.query.queries);
  100. const queries = [];
  101. for (let i = 0; i < numOfUpdates; i++) {
  102. queries.push(worldUpdateQuery);
  103. }
  104. this.body = yield queries;
  105. }
  106. function *textHandler() {
  107. this.set('Server', 'Koa');
  108. this.body = 'Hello, world!';
  109. }
  110. app.listen(8080);
  111. }