使用Express 4如何redirect到我自己的路线,而不会丢失req和响应数据?

我有我的应用程序结构3路由(API,pipe理,默认)。 每个人都有自己的文件,并有自己的中间件,并输出一个路由。 我面临的问题是当我想要转发到另一个路由器上的另一个路由器。 基本上我想调用相同的function,以便我不从多个位置提供相同的视图。

我不想用res.redirect('/ someplace'),因为我希望能够将req和res对象传递给方法。

|-app.js |-routes |---admin.js |---api.js |---default.js 

路线是必需的,并在app.js中使用如下

 app.use('/api', require('./routes/api')(passport); app.use('/admin', require('./routes/admin')(passport); app.use('/', require('./routes/default')(passport); 

在pipe理员的内部,如果有我需要redirectlogin和传递一些数据的情况

 // authenticates all routes for the admin router router.use(function(req, res, next){ if(req.isAuthenticated()){ return next(); } res.flashMessage.push('Session expired'); //is lost after redirect res.redirect('/login'); //do I need to restructure my whole app so that I don't //have to call res.redirect('login') }); 

任何想法如何构build这个? 我是否需要导出每个方法并将所有路由保存在一个路由器文件中? 这不是很干净,但如果function在别的地方可能太乱了。

您可以通过调用nextcallback来转发,但前提是您不使用任何path。

 app.use(function(req, res, next) { // ... api next(); }); app.use(function(req, res, next) { // ... admin next(); }); 

另一个select是使用* ,将匹配所有path:

 app.use("*", function(req, res, next) { var path = req.path; // just example how it can be done if (path === "/api") { // ... path = "/admin"; } if (path === "/admin") { // ... } }); 

编辑:

我不认为快递有像next('/login'); ,所以基本上可以将请求转发到另一个path,我不认为这是正确的。 如果客户要求/admin你应该发送这个特定的页面,而不是/login下的页面。 如果你想发送给客户端的login页面,而不是像你在问题中那样redirect。 我知道你想保持req, res ,但是这是webapp的提案/结构中的问题。