【问题标题】:Using Express 4 how to redirect to my own route without losing req and response data?使用 Express 4 如何在不丢失请求和响应数据的情况下重定向到我自己的路由?
【发布时间】:2014-07-20 19:06:35
【问题描述】:

我的应用程序由 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')
});

关于如何构建它的任何想法?我是否需要导出每种方法并将所有路由保存在一个路由器文件中?这不是很干净,但如果函数在其他地方,它可能太乱了。

【问题讨论】:

  • 如果您想从服务器端更改 URL,您将不得不将它们重定向出来并重新输入(这会丢失 req/res)。您是否考虑过根据 URL 参数是否存在在登录页面上显示消息?例如,如果用户直接导航到/login,他们看不到消息,但如果他们被重定向到那里,则将原始 URL 作为 URL 参数包含在内,如果存在,则显示消息。

标签: node.js express express-4


【解决方案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") {
       // ...
    }
});

编辑:

我不认为 express 有类似 next('/login'); 的东西,所以基本上可以将请求转发到另一条路径的功能,我认为拥有这样的东西是不正确的。如果客户要求/admin,您应该发送此特定页面,而不是/login 下的页面。如果您想将登录页面发送回客户端,而不是像在问题中那样重定向它。我了解您想保留 req, res ,但这是您的 web 应用程序的提案/结构中的问题。

【讨论】:

  • 我看到上面的评论说我可以在重定向中传递一个 url 参数,这是将 Flash 消息发送到重定向的最常见方式吗?
  • 我不确定你的意思。如果像 /login?msg=wrongPassword/login/msg/wrongPassword 这样的东西,那么是的,我会说这很常见......
猜你喜欢
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
  • 2021-09-12
  • 2018-02-14
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
相关资源
最近更新 更多