我想将一系列app.use()
次调用转移到自己的模块中。封装它的最简单方法是在导出中公开function(app)
,但我觉得移交app
对象太过于不透明的界面了。
我想从模块外部公开一个中间件app.use()
'd。我需要链接/组合内部使用的中间件。
有没有时尚的方式来做这个或另类?最简单的方法是什么?我应该避免什么?
答案 0 :(得分:2)
这个答案有点晚了,但是反正...
// composedMiddleware.js
const express = require('express')
const ware1 = (req, res, next)=>{...}
const ware2 = (req, res, next)=>{...}
const router = express.Router()
router.use(ware1)
router.use(ware2)
export default router
// app.js
const composedMiddleWare = require('./composedMiddleware.js')
app.get('/something', (req, res, next)=>{...})
app.get('/something', composedMiddleWare)
如果代码不是不言自明的,那么请注意路由器也是中间件。或者,更确切地说,“路由器的行为类似于中间件本身,因此您可以将其用作app.use()的参数” ref。
答案 1 :(得分:1)
浏览Express(以及它所基于的Connect)的代码,似乎在一个中间件上调用use
不会以任何方式通知任何内容,因此实际上没有办法编写东西没有通过app
提前。
但是,您可以在运行时进行合成,例如第一次调用中间件时,将一些函数组合在一起并缓存/调用它们。
答案 2 :(得分:1)
这是我的看法:
// app.js
...
app.use(require('./middleware')());
...
// middleware.js
var express = require('express');
module.exports = function() {
var middleware = [
// list of middleware that you want to have performed:
function mymiddleware(req, res, next) {
console.log('hello world');
next();
},
express.logger('dev'),
express.cookieParser(),
express.static(__dirname)
];
return function(req, res, next) {
(function iter(i, max) {
if (i === max) {
return next();
}
middleware[i](req, res, iter.bind(this, i + 1, max));
})(0, middleware.length);
};
};
如果您需要访问自定义中间件中的应用,可以通过req.app
或res.app
访问该应用。