Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js res.redirect在同一路由上创建另一个请求_Node.js_Express_Firebase_Firebase Authentication_Loopback - Fatal编程技术网

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

Node.js res.redirect在同一路由上创建另一个请求,node.js,express,firebase,firebase-authentication,loopback,Node.js,Express,Firebase,Firebase Authentication,Loopback,这是我第一次来这里,所以我希望我的帖子是正确的 我正在使用Loopback,当我尝试重定向到另一个路由时遇到了问题。 基本上我有两个中间产品。首先,与Firebase检查用户是否经过身份验证并允许访问/dashboard。如果没有,我调用next()中间件,这个中间件将重新重定向回/login Dashboard.js: 'use strict'; const firebase = require("firebase"); exports.dashboard

这是我第一次来这里,所以我希望我的帖子是正确的

我正在使用Loopback,当我尝试重定向到另一个路由时遇到了问题。 基本上我有两个中间产品。首先,与Firebase检查用户是否经过身份验证并允许访问/dashboard。如果没有,我调用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(“no one logged”);”将在控制台上显示两次,或者在流上显示任何其他日志。看起来又提出了一个请求,但我不明白为什么或者如何。如果删除重定向并简单地结束响应或呈现页面,则不会出现问题

谢谢!:)

更新

我回到这里,仍然没有解决办法。这让我快发疯了


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

 app.get('/dashboard', dashboard.dashboard, dashboard.notLogged);
此行表示在运行dashboard.dashboard之后,dashboard.notLogged仍将运行,无论您是否调用next()

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

     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)

这是不正确的。如果您正在构建中间件链,则它们将按顺序调用,并且仅当前面的中间件正在调用
next()
。是的,这实际上是错误的。这样,响应就卡在“else”中,什么也没发生。无论如何,谢谢!:)我试着这样做:在else:
notLogged(req,res)和中间件:
函数notLogged(req,res){console.log(“无人登录”);res.status(200);res.redirect('/login');res.end()}exports.notLogged=notLogged这也可以,但没有解决问题:/