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

标签 node.js express firebase firebase-authentication loopback

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

我在这里使用 Loopback,当我尝试重定向到另一条路由时遇到问题。 基本上我有两个中间件。首先,使用 Firebase 检查用户是否已通过身份验证并允许访问/dashboard。如果不是,我调用 next() 中间件,这个中间件再次重定向回/login。

仪表板.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 in");”将在控制台或流中的任何其他日志上出现两次.看起来好像提出了另一个请求,但我不明白为什么或如何。如果我删除重定向并简单地结束响应或呈现页面,则不会出现问题。

谢谢! :)

更新

我回到这里,仍然没有解决方案。这让我发疯。

Double GET happening after res.redirect :(

最佳答案

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

 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

关于node.js - res.redirect 在同一路由上创建另一个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39198729/

相关文章:

javascript - Jest + super 测试: how to reset the mocked dependency

firebase - 在 firebase 实时数据库中,如何调试使用负载的峰值?

android - "An org admin has to sign the addendum before you can select the options Apps or Apps and web"|谷歌分析

javascript - 如何使用 Javascript 和 Node js 从表单传递数组

node.js - 我无法通过将 http-headers 通过管道传输到 node.js 中来将其保存到文件中

node.js - Passport token auth *without* 数据​​库 session

firebase - Flutter 应用在​​ Release 模式下使用 Firestore 插件时崩溃

javascript - postgres 不支持 TypeORM 数组?

mysql - SQL SELECT IN 数组 NodeJS

javascript - Node Express 处理来自外部 api 的身份验证 token