如何在 express.js 中使用嵌套中间件

How to use nested middleware in express.js

我想对代码的实际结构进行更改。这是我的实际代码:

//index.js
var routes = require('./routes');
var subdomain = require('express-subdomain');

//require express app with settings
var app = require('./app');

//export the application
module.exports = app;

// routes request like endusers-api.mydomain.ext/
app.use(subdomain('endusers-api', routes.apis.endusers));
// routes request like mydomain.ext/
app.use(routes.webapps.endusers);


//routes/index.js
var apis = {endusers: require("./apis/endusers")}
var webapps = {endusers: require("./webapps/endusers")}
var routes = {apis: apis,   webapps: webapps}

module.exports = routes;


//routes/apis/endusers
var express = require('express');
var route = express.Router();
var logger = require('../../lib/logger');

route.get('/', logger("endusers-api-access"), function(req, res, next) {
    res.json({
        "name" : "Endusers API"
    });
});

module.exports = route;


//routes/webapps/endusers.js
var express = require('express');
var route = express.Router();
var logger = require('../../lib/logger');

route.get('/', logger("endusers-webapp-access"), function(req, res, next) {
    res.render('endusers/index', {title: 'Homepage'});
});

module.exports = route;

现在我想将上面的代码更改为这个(请随时告诉我这是否是在 Node.js 中做事的好方法):

//index.js
var middlewares = require('./middlewares');
var app = require('./app');

module.exports = app;

//i want to change to this
app.use(middlewares.endusersApi);
app.use(middlewares.endusersWebapp);

//Stuff for creating server and listening...


//middlewares/index.js
var middlewares = {
  endusersApi : require("./apis/endusers"), 
  endusersWebapp : require("./webapps/endusers")
}

module.exports = middlewares;


//middlewares/apis/endusers.js
//TODO


//middlewares/webapps/endusers
//TODO

上面的TODO部分应该怎么写。看起来我们需要嵌套中间件(一个中间件调用另一个中间件)。请您提出建议。

我通过 express.Router().all() 方法找到了答案。

//middlewares/apis/endusers.js
var routes = require('../../routes');
var express = require('express');
var middleware = express.Router();

middleware.all('/',subdomain('endusers-api', routes.apis.endusers));
//the two next lines are alternatives to the line above 
//middleware = subdomain('endusers-api', routes.apis.endusers); //can assign only one route
//middleware.use(subdomain('endusers-api', routes.apis.endusers)); // can use many routes

module.exports = middleware;


//middlewares/webapps/endusers.js
var routes = require('../../routes');
var express = require('express');
var middleware = express.Router();

middleware.all('/', routes.webapps.endusers);
//the two next lines are alternatives to the line above 
//middleware = routes.webapps.endusers; //can assign only one route
//middleware.use(routes.webapps.endusers); // can use many routes

module.exports = middleware;