app.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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('/fortunes', fortuneHandler));
  33. app.use(route.get('/updates', 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. this.set('Server', 'Koa');
  88. var fortunes = yield fortunesQuery;
  89. fortunes.push({
  90. id: 0,
  91. message: 'Additional fortune added at request time.'
  92. });
  93. fortunes.sort(function(a, b) {
  94. return a.message < b.message ? -1 : 1;
  95. });
  96. yield this.render("fortunes", {
  97. fortunes: fortunes
  98. });
  99. }
  100. function *updateHandler() {
  101. var numOfUpdates = isNaN(this.query.queries) ? 1 : this.query.queries,
  102. queries = [];
  103. if (numOfUpdates > 500) {
  104. numOfUpdates = 500;
  105. } else if (numOfUpdates < 1) {
  106. numOfUpdates = 1;
  107. }
  108. for (var i = 0; i < numOfUpdates; i++) {
  109. queries.push(worldUpdateQuery);
  110. }
  111. this.body = yield queries;
  112. }
  113. function *textHandler() {
  114. this.body = 'Hello, world!'
  115. }
  116. app.listen(3000); //used for local testing
  117. }