1 var Koa = require('koa'), 2 Router = require('../Router'), 3 request = require('supertest'), 4 should = require('should'), 5 http = require('http'); 6 7 describe('Router Test', function () { 8 var server, router; 9 before(function () { 10 var app = new Koa(); 11 router = new Router(); 12 router.post('/test', function (ctx) { 13 var param = ctx.request.query; 14 var time = param["time"] || 100; 15 return new Promise(function (resolve, reject) { 16 setTimeout(function () { 17 resolve({ 18 "success": true 19 }); 20 }, Number(time)); 21 22 }).then(function (result) { 23 ctx.body = result; 24 }).catch(function (err) { 25 ctx.body = { 26 "success": false 27 }; 28 }); 29 }); 30 31 router.get('/test3', function* (next) { 32 33 this.body = yield new Promise(function (resolve, reject) { 34 setTimeout(function () { 35 resolve({ 36 "success": true, 37 "msg": "test3" 38 }); 39 }, 22); 40 41 }) 42 43 }); 44 45 router.get('/test4', async function (ctx) { 46 ctx.body = await new Promise(function (resolve, reject) { 47 setTimeout(function () { 48 resolve({ 49 "success": true, 50 "msg": "test4" 51 }); 52 }, 22); 53 54 }) 55 }); 56 57 app.use(router.routes()); 58 server = http.createServer(app.callback()); 59 }); 60 61 after(function () { 62 server.close(); 63 }); 64 65 it('Promise寫法', function (done) { 66 67 router.get('/promise', function (ctx, next) { 68 return new Promise(function (resolve, reject) { 69 setTimeout(function () { 70 console.log(1); 71 ctx.body = { message: 'Hello ' }; 72 resolve(next().then(() => { 73 console.log(3); 74 })); 75 76 }, 1); 77 }); 78 }, function (ctx) { 79 return new Promise(function (resolve, reject) { 80 setTimeout(function () { 81 console.log(2); 82 ctx.body.message += 'World'; 83 resolve(); 84 }, 1); 85 86 }).then(function (data) { 87 ctx.body.message += '!'; 88 }); 89 90 }); 91 92 request(server) 93 .get('/promise') 94 .expect(200) 95 .end(function (err, res) { 96 if (err) return done(err); 97 res.body.message.should.eql('Hello World!'); 98 done(); 99 }); 100 }); 101 102 it('異步函數寫法', function (done) { 103 104 router.get('/asyncfunction', async function (ctx, next) { 105 ctx.body = await new Promise(function (resolve, reject) { 106 setTimeout(function () { 107 console.log(1); 108 resolve({ message: 'Hello ' }); 109 }, 1); 110 }); 111 await next(); 112 ctx.body.message += "!"; 113 }, async function (ctx) { 114 var b = await new Promise(function (resolve, reject) { 115 setTimeout(function () { 116 console.log(2); 117 resolve("World"); 118 }, 1); 119 }) 120 ctx.body.message += b; 121 }); 122 123 request(server) 124 .get('/asyncfunction') 125 .expect(200) 126 .end(function (err, res) { 127 if (err) return done(err); 128 res.body.message.should.eql('Hello World!'); 129 done(); 130 }); 131 }); 132 133 134 135 it('generater函數寫法', function (done) { 136 137 router.get('/generater', function* (next) { 138 139 this.body = yield new Promise(function (resolve, reject) { 140 setTimeout(function () { 141 console.log(1); 142 resolve({ message: 'Hello' }); 143 }, 1); 144 }); 145 yield next; 146 console.log(3); 147 this.body.message += "!"; 148 149 }, function* (next) { 150 var b = yield new Promise(function (resolve, reject) { 151 setTimeout(function () { 152 console.log(2); 153 resolve(" World"); 154 }, 1); 155 }) 156 this.body.message += b; 157 }); 158 159 request(server) 160 .get('/generater') 161 .expect(200) 162 .end(function (err, res) { 163 if (err) return done(err); 164 res.body.message.should.eql('Hello World!'); 165 done(); 166 }); 167 }); 168 169 170 171 172 });
1 var Router = require('koa-router'); 2 var Layer = require('koa-router/lib/layer'); 3 var isGeneratorFunction = require('is-generator-function'); 4 var convert = require('koa-convert'); 5 module.exports = Router; 6 /** 7 * Create and register a route. 8 * 9 * @param {String} path Path string. 10 * @param {Array.<String>} methods Array of HTTP verbs. 11 * @param {Function} middleware Multiple middleware also accepted. 12 * @returns {Layer} 13 * @private 14 */ 15 16 Router.prototype.register = function (path, methods, middleware, opts) { 17 opts = opts || {}; 18 19 var router = this; 20 var stack = this.stack; 21 22 // support array of paths 23 if (Array.isArray(path)) { 24 path.forEach(function (p) { 25 router.register.call(router, p, methods, middleware, opts); 26 }); 27 28 return this; 29 } 30 31 // Support for generators 32 middleware.forEach(function (fn, i) { 33 if (isGeneratorFunction(fn)) { 34 middleware[i] = convert(fn); 35 } 36 }); 37 38 // create route 39 var route = new Layer(path, methods, middleware, { 40 end: opts.end === false ? opts.end : true, 41 name: opts.name, 42 sensitive: opts.sensitive || this.opts.sensitive || false, 43 strict: opts.strict || this.opts.strict || false, 44 prefix: opts.prefix || this.opts.prefix || "", 45 ignoreCaptures: opts.ignoreCaptures 46 }); 47 48 if (this.opts.prefix) { 49 route.setPrefix(this.opts.prefix); 50 } 51 52 // add parameter middleware 53 Object.keys(this.params).forEach(function (param) { 54 route.param(param, this.params[param]); 55 }, this); 56 57 stack.push(route); 58 59 return route; 60 };