我的应用程序结构为3路(api,admin,默认)。每个人都有自己的文件,并拥有自己的中间件并导出路由。我面临的问题是当我想要转发到另一个路由器上时,该路由器位于不同的路由器上。基本上我想调用相同的函数,这样我就不会从多个位置提供相同的视图。
我不想使用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);
在管理员内部,如果我需要重定向登录并传递一些数据
// 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')
});
关于如何构建这个的任何想法?我是否需要导出每个方法并将所有路由保存在一个路由器文件中?这不是很干净,但如果功能在其他地方,它可能太乱了。
答案 0 :(得分:1)
您可以通过调用next
回调转发它,但前提是您不使用任何路径。
app.use(function(req, res, next) {
// ... api
next();
});
app.use(function(req, res, next) {
// ... admin
next();
});
另一个选项是使用*
来匹配所有路径:
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');
的东西,所以基本上可以将请求转发到另一条路径,我不认为这样做是正确的。如果客户要求/admin
,您应该发送此特定页面,而不是/login
下的页面。如果您要将登录页面发送回客户端,而不是像在问题中那样重定向它。我们了解您希望保留req, res
,但这是您的网络应用提案/结构中的问题。