res.redirect在同一路由上创建另一个请求

时间:2016-08-29 04:58:31

标签: node.js express firebase firebase-authentication loopback

这是我第一次来这里,所以我希望我能正确发布。

我在这里使用Loopback,当我尝试重定向到另一条路线时遇到问题。 基本上我有两个中间件。首先,如果用户经过身份验证并允许访问/仪表板,请检查Firebase。如果不是,我调用next()中间件,然后重新定向到/ login。

Dashboard.js:

'use strict';
    const firebase = require("firebase");
    exports.dashboard = (req, res, next) => {
      firebase.auth().onAuthStateChanged((user) => {
          if (user) {
            console.log("Before render: "+res.headersSent); // false
            res.render("dashboard", {photoUrl: user.photoURL, displayName: user.displayName, email: user.email });
            console.log("after render: "+res.headersSent);
          } else {
            // console.log("on else"  );
            next()
          }
      });

    };

    exports.notLogged = (req, res) => {
      console.log("no one logged in");
      res.redirect('/login');
    };

在server.js上路由:

 app.get('/dashboard', dashboard.dashboard, dashboard.notLogged);

login.js上的中间件:

exports.login = (req, res) => res.render("login")

其路线:

app.get('/login', login.login);

例如,如果我尝试访问" / dashboard"我没有登录," console.log("没有人登录"); "将在控制台或流上的任何其他日志上两次。它看起来像另一个请求,但我无法理解为什么或如何。如果我删除重定向并简单地结束响应或呈现页面,则不会发生此问题。

谢谢! :)

更新
嗨,大家好!我回到这里仍然没有解决方案。这真让我抓狂! 我希望有人来告诉我有什么问题! :(

Double GET happening after res.redirect :(

再次感谢你。

1 个答案:

答案 0 :(得分:2)

您可能以错误的方式使用中间件。

 app.get('/dashboard', dashboard.dashboard, dashboard.notLogged);

此行表示在运行dashboard.dashboard后,无论是否正在调用next()

,dashboard.notLogged都会正在运行

所以你可以解决这个问题:

     if (user) {
        console.log("Before render: "+res.headersSent); // false
        res.render("dashboard", {photoUrl: user.photoURL, displayName: user.displayName, email: user.email });
        console.log("after render: "+res.headersSent);
      } else {
        // console.log("on else"  );
        notLogged()
      }

从此处删除notLogged:

 app.get('/dashboard', dashboard.dashboard)

http://expressjs.com/en/4x/api.html#router