所以我最终试图在节点中创建一个登录页面。如果某人尝试前往其他位置,则应将其路由到登录页面。
我正在使用“/”作为重定向到“/ login /”。 “/ login /”包含输入用户名/密码的表单。一旦他们输入信息,它就会路由回“/”。
遇到一些问题。如果我排除了重定向的代码,如果原始网址是“/”而某人转到“/ login /”那么他们可以填写表单并重定向。
如果我保留重定向的代码,它会自动重定向到登录页面,然后由于重定向而重新加载到登录页面。这是一个我无法摆脱的怪异循环。我知道我可以把另一端放到“/ login /”但我想保留它“/”。
有关修复重定向循环的任何想法?编辑:所以我知道问题是什么。我不存储用于比较(不使用会话)。有关用于检查会话的最佳中间件的任何线索吗?
如何添加身份验证甚至将用户名/密码添加到数据结构?
以下是我提出的代码:
const express = require("express"); //Express
const path = require ("path");
const session = require("express-session"); //Express Session
const app = express();
const mustache = require ("mustache");
const mustacheExpress = require('mustache-express');
const bodyParser = require ("body-parser");
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:true}));
app.engine('mustache', mustacheExpress());
app.set('views', './views')
app.set('view engine', 'mustache')
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: false,
cookie:{}
}));
app.use((req, res, next) => {
if (req.originalUrl === '/') {
res.redirect("/login/");
}
next();
});
const list = [
{
username: "",
password: "",
}
];
const data = {
users:list
};
app.get('/login/', function (req, res) {
res.render("users", data);
});
app.post("/", function(req, res){
console.log(req.body);
let username = req.body.username;
let password = req.body.password;
let response = `Here are your credentials for the site: <br/>
This is your username: ${username} <br/>
This is your password: ${password} <br/>
<img src="http://media1.giphy.com/media/c54YHGDH63jJC/giphy.gif"/>`
res.send(response);
});
app.post("/", function (req, res) {
console.log(list);
list.push({username:req.body.username});
list.push({username:req.body.password});
res.redirect('/');
})
app.listen(3000, function () {
console.log('Creating login page');
})
答案 0 :(得分:0)
如果每次用户点击根(/),他们都会被重定向到/ login,并且成功登录然后将它们重定向回root,你显然有一个我认为你知道的路由循环。
最简单的解决方案是建立一条新路线,引导用户成功登录,例如/ home。我看到你回复了一条回复,所以我会提供两种可能性。此外,对于相同的POST路由,您有2个不同的处理程序,这是不必要的。这就是我的建议:
app.post("/login", function(req, res){
console.log(req.body);
let username = req.body.username;
let password = req.body.password;
let response = `Here are your credentials for the site: <br/>
This is your username: ${username} <br/>
This is your password: ${password} <br/>
<img src="http://media1.giphy.com/media/c54YHGDH63jJC/giphy.gif"/>`;
// actions from duplicate route handler
console.log(list);
list.push({username:req.body.username});
list.push({username:req.body.password});
// this is assuming you are handling errors on the front end
res.status(201).send(response);
});
然后,我会根据您的api的成功响应,然后使用前端的javascript更改路线。
window.location.assign(urlToNewRoute);
或者,您可以将带有响应的重定向作为查询字符串发送,然后在前端解析,而不是发送res.status(201).send(响应)。
res.redirect(`/home?message=${response}`);
您想要如何设计api和前端站点真的取决于您。这些只是几个选项。实际上,您应该在POST路由中进行错误处理以检查用户是否存在,是否输入了正确的密码等,然后发回201,400,404或其他一些简洁状态,然后可以在前面处理端。
希望这有帮助。
答案 1 :(得分:0)
你是对的。您需要使用一些会话信息从/login/
重定向到/
。最简单的方法是返回控制器可以验证的令牌,如果它无效,可以重定向回/login/
。您可以使用JWT作为令牌。