zoukankan      html  css  js  c++  java
  • 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源码下载

  • 相关阅读:
    Activiti6详细教程
    Nginx 与 Tomcat : 413 Request Entity Too Large(请求实体太大)
    windows下安装pytorch
    vim编辑器常用操作
    el-dialog 里面的组件不刷新问题
    el-dialog 里面的 el-form 重置表单问题
    ElementUI树形表格默认展开
    设计模式之 工厂方法模式
    linux创建一个proc代码示例
    redis的安装及使用
  • 原文地址:https://www.cnblogs.com/godghdai/p/7055433.html
Copyright © 2011-2022 走看看