app.js 3.2 KB

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