您可以在Node.JS Express应用程序中插入中间件吗?

时间:2012-12-03 20:07:54

标签: node.js express

有没有办法在Express堆栈中注入中间件?我的意思是我想让我的app.js设置主要的中间件链,然后调用其他模块传递app实例,他们可能想要插入更多的中间件(例如,想要在正确的地方添加护照的认证模块)

3 个答案:

答案 0 :(得分:12)

您当然可以将app对象传递给其他模块并在那里调用use。当然,中间件功能按照添加顺序执行,因此您必须非常小心,确保以正确的顺序调用use

app.js

var app = express();
// ...

app.use(express.logger()); // first middleware function

var someOtherModule = require('./mod.js');
someOtherModule.init(app);

app.use(express.static()); // last middleware function)

mod.js

exports.init = function(app) {
    app.use(function(req, res, next) {

    });
};

实际上在堆栈中间注入中间件函数(在你用一组中间件函数调用app.use之后),没有记录的方法可以做它。 use只在堆栈末尾添加一个函数。

use实际上是由proto.js中的Connect提供的:

app.use = function(route, fn){

  ...

  this.stack.push({ route: route, handle: fn });

  return this;
};

技术上,您可以自己动手app.stack,但我不会这样做。你会搞乱一个没有文档的实现细节,这个细节很容易改变。换句话说,将来 Connect或Express的更新可能会破坏您的应用。

答案 1 :(得分:1)

你可以使用app.use(fn)或像这样堆叠它们:

app.get('/foo', fn1, fn2, fn3);

签名必须始终相同并调用next();

function(req, res, next) {
  next();
}

答案 2 :(得分:0)

我不明白这是什么问题?

您可以在中间件中添加任何功能:

app.use(function(req,res,next){
   //some munipulation with req and res
   next()
})

你可以将这个app发送给你的模块