app.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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.body = {
  73. message: "Hello, world!"
  74. }
  75. }
  76. function *dbHandler() {
  77. this.body = yield worldQuery;
  78. }
  79. function *queriesHandler() {
  80. var numOfQueries = validateParam(this.query.queries);
  81. var queries = [];
  82. for (var 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. var fortunes = yield fortunesQuery;
  90. fortunes.push({
  91. id: 0,
  92. message: 'Additional fortune added at request time.'
  93. });
  94. fortunes.sort(function(a, b) {
  95. return a.message < b.message ? -1 : 1;
  96. });
  97. yield this.render("fortunes", {fortunes: fortunes});
  98. }
  99. function *updateHandler() {
  100. var numOfUpdates = validateParam(this.query.queries);
  101. var queries = [];
  102. for (var i = 0; i < numOfUpdates; i++) {
  103. queries.push(worldUpdateQuery);
  104. }
  105. this.body = yield queries;
  106. }
  107. function *textHandler() {
  108. this.body = 'Hello, world!';
  109. }
  110. app.listen(8080);
  111. }