2016-08-29 59 views
3

這是我第一次來這裏,所以我希望我可以正確地發佈此信息。res.redirect在同一條路線上創建另一個請求

我在這裏使用Loopback,當我嘗試重定向到另一條路由時遇到問題。 基本上我有兩個中間件。第一種方法是使用Firebase檢查用戶是否經過身份驗證並允許訪問/儀表板。如果不是,我打電話給下一個()中間件,然後這個中間件再次重定向回/登錄。

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 in「); 「會在控制檯或其他任何日誌上顯示兩次,看起來又是另一個請求,但我無法理解爲什麼或如何,如果我刪除了重定向並簡單地結束響應或呈現頁面,不會出現問題。

謝謝!:)

UPDATE
嗨,大家好!我回來這裏仍然無解。這是推動我瘋了! 我希望有人來了,告訴我什麼是錯的!:(

Double GET happening after res.redirect :(

再次感謝您。

回答

2

您可能以錯誤的方式使用了中間件。

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

運行dashboard.dashboard後,該行指,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

+0

這是不正確的。如果您正在構建中間件鏈,那麼只有在前一箇中間件調用'next()'的情況下才會按順序調用它們。 – Jonas

+0

是的,這實際上是錯誤的。這樣,響應卡在「其他」中,沒有任何反應。不管怎麼說,還是要謝謝你! :) –

+0

我想是這樣的: 在其他: 'notLogged(REQ,RES);' 而中間件: '函數notLogged(REQ,RES){ 的console.log(「沒有人登錄」); res。狀態(200); res.redirect('/ login'); res.end() } exports.notLogged = notLogged; ' 這也適用,但沒有解決問題:/ –