app.js 2.6 KB

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