这是我第一次来这里,所以我希望我能正确发布。
我在这里使用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("没有人登录"); "将在控制台或流上的任何其他日志上两次。它看起来像另一个请求,但我无法理解为什么或如何。如果我删除重定向并简单地结束响应或呈现页面,则不会发生此问题。
谢谢! :)
更新
嗨,大家好!我回到这里仍然没有解决方案。这真让我抓狂!
我希望有人来告诉我有什么问题! :(
再次感谢你。
答案 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)