分组和pipe理node.js中间件

如果我已经制作了一些可以一起工作的中间件,那么分组和pipe理function的最佳约定是什么?

在我的server.js文件中,我目前刚刚通过app.use调用了一个又一个的app.use

但是,我发现,如果我的第一个数据没有产生任何数据,组中的后续数据就可以跳过了。 我想这最终是一个聚合,虽然我没有看到在其他项目中的任何例子。

       

网上收集的解决方案 "分组和pipe理node.js中间件"

连接中间件就是这种问题的一个很好的例子。 看看bodyParser :

 app.use(connect.bodyParser()); // use your own grouping here 

相当于

 app.use(connect.json()); app.use(connect.urlencoded()); app.use(connect.multipart()); 

bodyParser函数的内部只是通过前面提到的中间件函数传递reqres对象

 exports = module.exports = function bodyParser(options){ var _urlencoded = urlencoded(options) , _multipart = multipart(options) , _json = json(options); return function bodyParser(req, res, next) { _json(req, res, function(err){ if (err) return next(err); _urlencoded(req, res, function(err){ if (err) return next(err); _multipart(req, res, next); }); }); } }; 

完整的代码可以在github 回购中find

编辑

在下面的评论中告诉我们,传递一个数组将获得完全相同的结果,所以不需要额外的模块。 🙂


我正在寻找一种方法来做到这一点,因为我的应用程序是非常精细的,但我不想嵌套在其他答案的一切。

我确信已经有更全面的东西了,但是我最终做到了这一点:

  /** * Macro method to group together middleware. */ function macro (...middlewares) { // list of middlewares is passed in and a new one is returned return (req, res, next) => { // express objects are locked in this scope and then // _innerMacro calls itself with access to them let index = 0; (function _innerMacro() { // methods are called in order and passes itself in as next if(index < middlewares.length){ middlewares[index++](req, res, _innerMacro) } else { // finally, next is called next(); } })(); } } 

然后像这样使用它:

 var macro = macro( middleware1, middleware2, middleware3 ); app.post('/rout', macro);