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 };
https://github.com/godghdai/spider源码下载