app.js 3.2 KB

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