你能在Node.JS Express应用程序中插入中间件吗?

8

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

3个回答

14

你可以把你的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 实际上是由 Connect 在 proto.js 中提供的:


app.use = function(route, fn){

  ...

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

  return this;
};

从技术角度来说,您可以自己调整 app.stack,但是我不建议这样做。您会干扰一个未经记录的实现细节,而这个细节有可能会发生改变。换句话说,未来 无论是 Connect 还是 Express 的更新都有可能破坏您的应用程序。


谢谢 - 我没想到有办法(也想不出应该放在哪个位置)。我可能会采用你一开始建议的方法。 - MrPurpleStreak
1
非常好的胜利,表示顺序很重要!谢谢! - JWally

0

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

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

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

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

-3

我不明白问题出在哪里?

你可以在中间件中添加任何函数:

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

你可以将这个应用程序发送到你的模块中


3
我认为问题在于app.use总是将你的中间件函数添加到堆栈末尾,因此较早添加的中间件可能在你的函数有机会运行之前就完成了对请求的处理。 - josh3736
例如?什么时候需要它? - Boris Pavlovic
为了保持更模块化的结构 - 所以我希望所有与身份验证有关的内容都在 authenticate.js 中处理 - 它会在其中创建 passport 对象,因此我不想将其传递出去,而是希望将 app 传递进来,并让该模块在 express.session 之后但在 router 之前添加 passport.initialize 和 passport.session 中间件。 - MrPurpleStreak
但是你可以创建一个身份验证模块,并做一些像module.exports = exports = function(app){ ///在这里添加所有使用passport的内容 }的事情。 - Boris Pavlovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接