koa2 router中间件的三种写法

  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源码下载

原文地址:https://www.cnblogs.com/godghdai/p/7055433.html