Nodejs 给组合的中间件命名,In Koa

Nodejs 给组合的中间件命名,In Koa

组合中间件

在Koa中如果要组合一组中间件,可以使用koa-compose模块(顺便说下,Koa核心中间件模型就是由koa-composeco驱动的)

例子:

app.use(compose([
  rt,
  response
]));

为什么要给组合的中间件命名,利好?

如果我们开启DEBUG模式,

$ DEBUG=koa:* node --harmory app.js

我们是无法看出这个组合之后的中间件叫啥,如果中间件一多,不好跟踪,很疼 因为compose返回的是一个匿名的GeneratorFunction

如何命名?

列举下几种方式:

  • 包裹compose之后的中间件, 酒可以随意的给wapper命名了:
var fn = compose(...);
function* name(next) {
   yield fn;
   yield next;
}
app.use(name);
  • 设置_name属性,因为在DEBUG模式下,会优先检查_name属性,具体请看https://github.com/koajs/koa/blob/master/lib/application.js#L98:
var fn = compose(...);
fn._name = 'foo';
  • 使用第三方模块node-function-name,一个c++模块
    (注:当前该模块的nan还没升级到最新1.0.0,v0.11.13下编译会失败;手动把nan升级到1.0.0,测试通过)
var set = require('function-name');
var fn = compose(...);
set(fn, 'bar');
console.log(fn.name);

完整例子 https://github.com/fundon/examples/tree/named-compose/named-compose

— END
KOA ON THE ROAD.


4 回复

Nodejs 给组合的中间件命名,In Koa

在Koa框架中,中间件是一种非常重要的概念。为了更好地管理和调试中间件,给组合后的中间件命名是一个很好的实践。本文将介绍如何在Koa中为组合的中间件命名,并提供相应的示例代码。

组合中间件

在Koa中,我们可以使用koa-compose模块来组合多个中间件。例如:

const compose = require('koa-compose');

const rt = function*(next) {
    console.log('rt middleware');
    yield next;
};

const response = function*(next) {
    yield next;
    this.body = 'Hello World';
};

const middleware = compose([
    rt,
    response
]);

app.use(middleware);

在这个例子中,我们组合了两个中间件rtresponse。但是,当我们在DEBUG模式下运行时,这些组合后的中间件是没有名称的,这会导致调试变得困难。

为什么要给组合的中间件命名?

在Koa的DEBUG模式下,如果中间件没有名称,调试起来会非常麻烦。例如:

$ DEBUG=koa:* node --harmony app.js

在这种情况下,我们无法直接从日志中看出每个中间件的具体名称,尤其是在中间件数量较多的情况下。

如何命名?

以下是几种给组合的中间件命名的方法:

  1. 包裹组合后的中间件

    我们可以创建一个新的中间件函数来包裹组合后的中间件,并给这个新的中间件函数命名。

    const compose = require('koa-compose');
    
    const rt = function*(next) {
        console.log('rt middleware');
        yield next;
    };
    
    const response = function*(next) {
        yield next;
        this.body = 'Hello World';
    };
    
    const middleware = compose([
        rt,
        response
    ]);
    
    function* namedMiddleware(next) {
        console.log('namedMiddleware');
        yield middleware;
        yield next;
    }
    
    app.use(namedMiddleware);
    
  2. 设置 _name 属性

    koa-compose返回的中间件上设置_name属性。Koa在DEBUG模式下会优先检查这个属性。

    const compose = require('koa-compose');
    
    const rt = function*(next) {
        console.log('rt middleware');
        yield next;
    };
    
    const response = function*(next) {
        yield next;
        this.body = 'Hello World';
    };
    
    const middleware = compose([
        rt,
        response
    ]);
    
    middleware._name = 'myMiddleware';
    
    app.use(middleware);
    
  3. 使用第三方模块 node-function-name

    使用第三方模块node-function-name来给中间件命名。需要注意的是,该模块的nan版本可能需要手动升级。

    const compose = require('koa-compose');
    const functionName = require('function-name');
    
    const rt = function*(next) {
        console.log('rt middleware');
        yield next;
    };
    
    const response = function*(next) {
        yield next;
        this.body = 'Hello World';
    };
    
    const middleware = compose([
        rt,
        response
    ]);
    
    functionName(middleware, 'myMiddleware');
    
    app.use(middleware);
    

完整例子

完整的例子可以在以下链接中找到:GitHub 示例

通过以上方法,我们可以更方便地管理和调试Koa中的组合中间件,提高开发效率。


不明觉厉

node-function-name 作者已更新nan到1.0.0 写了个小模块 https://github.com/fundon/composedly

在Koa中组合多个中间件时,可以通过不同的方法为这些组合后的中间件命名。这样有助于调试和追踪问题,尤其是在开启了DEBUG模式时。以下是几种为组合中间件命名的方法,并附上示例代码。

方法1: 包装组合后的中间件

你可以将组合后的中间件包裹在一个带有名称的生成器函数中。这样可以方便地给中间件起一个有意义的名字。

const compose = require('koa-compose');

// 定义中间件
function middlewareA(ctx, next) {
  console.log('Middleware A is running.');
  return next();
}

function middlewareB(ctx, next) {
  console.log('Middleware B is running.');
  return next();
}

// 使用koa-compose组合中间件
const combinedMiddleware = compose([middlewareA, middlewareB]);

// 包装成一个新的带有名字的中间件
function namedMiddleware(ctx, next) {
  console.log('Named Middleware is running.');
  return combinedMiddleware(ctx, next);
}

namedMiddleware._name = 'MyNamedMiddleware';

// 使用Koa应用实例来使用这个中间件
const Koa = require('koa');
const app = new Koa();
app.use(namedMiddleware);

app.listen(3000);

方法2: 设置_name属性

直接给组合后的中间件对象设置一个_name属性。这在开启DEBUG模式时,可以帮助识别中间件的名字。

const compose = require('koa-compose');

function middlewareA(ctx, next) {
  console.log('Middleware A is running.');
  return next();
}

function middlewareB(ctx, next) {
  console.log('Middleware B is running.');
  return next();
}

const composed = compose([middlewareA, middlewareB]);
composed._name = 'MyComposedMiddleware';

const Koa = require('koa');
const app = new Koa();
app.use(composed);

app.listen(3000);

方法3: 使用node-function-name模块

这个方法依赖于一个C++扩展,用于直接给函数命名。但需要注意的是,该库需要额外的配置步骤,比如确保nan版本正确。

const compose = require('koa-compose');
const set = require('function-name');

function middlewareA(ctx, next) {
  console.log('Middleware A is running.');
  return next();
}

function middlewareB(ctx, next) {
  console.log('Middleware B is running.');
  return next();
}

const composed = compose([middlewareA, middlewareB]);
set(composed, 'MyCustomName');

const Koa = require('koa');
const app = new Koa();
app.use(composed);

app.listen(3000);

以上三种方法都可以有效地为Koa中的组合中间件命名,便于调试和追踪。

回到顶部