4

我目前正在使用 formBuilder(客户端 javascript <=> JSON <=> 节点),所以我需要有效的方法来处理服务器上的 JSON 数据。所有表单都绑定在一条路线上,由中间件捕获,所以我需要这样的东西:

代码被简化(没有正则表达式、req 验证器等..)

var middleware = require('../middleware'); // simple dir to object export

exports = module.exports =function(req,res,next) {
  if(req.xhr && req.is('application/json')) {
    var i, items = req.body.events.length;
    for(i = 0; i < items; i++) {
      var event = req.body.events[i];
      if(middleware.forms[event] {
        // -----------------
        and here add that middleware into current flow ..
        // -----------------
      }
    }
  } else {
    return next();
}

最简单的方法是准备中间件列表,这些中间件将被使用并在最终路由中调用它们异步..但我不认为这是一个好方法..

那么,我有什么方法可以将请求的中间件添加到当前流程中,但在 filan 路由之前?

4

2 回答 2

10

中间件只是功能。所以只是打电话给他们没有错。我上周遇到了同样的问题,我写了一个小帮手。

 var walkSubstack = function (stack, req, res, next) {

  if (typeof stack === 'function') {
    stack = [stack];
  }

  var walkStack = function (i, err) {

    if (err) {
      return next(err);
    }

    if (i >= stack.length) {
      return next();
    }

    stack[i](req, res, walkStack.bind(null, i + 1));

  };

  walkStack(0);

};

您可以将它与一个数组或一个函数一起使用。

walkSubstack(middleware, req, res, next);
//or
walkSubstack([middleware, middleware], req, res, next);
于 2012-07-29T22:25:10.773 回答
0

我写了一些非常相似的东西:

let isActive1 = false;
let isActive2 = false;
let func1MD = (req, res, next) { /* ... */ }
let func2MD = (req, res, next) { /* ... */ }

let middleware = (function () {

  // middleware #1
  function func1(req, res, next) {
    if (!isActive1) { return next(); }

    return func1MD.call(null, req, res, next);
  }

  // middleware #2
  function func2(req, res, next) {
    if (!isActive2) { return next(); }

    return func2MD.call(null, req, res, next);
  }

  // Returning an array of all middlewares to be called sequentially
  return [
    func1,
    func2
  ]
})();

app.use(middleware);
于 2017-03-31T15:04:06.527 回答