app.js 3.1 KB

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