我有一個登錄系統,用戶將資料發布到 /login 路由,如果記錄正確,它會保存資料。
router.post('/login', function(req, res, next) {
if(req.method == 'POST') {
const username = req.body.username;
const password = req.body.password;
sql.query('SELECT * FROM `users` WHERE `username` = "' username '"', function(err, results) {
if(err) {
req.session.message = {status: 'danger', message: 'Failed to login, check password.'}
res.redirect('/')
} else if (results.length != 0) {
const passw = results[0].password;
bcrypt.compare(password, passw, function(err, result) {
if(result) {
req.session.loggedin = true;
req.session.data = results[0];
req.session.message = {status: 'success', message: `Welcome back, ${username}.`}
req.session.save(function(err) {
res.redirect(req.headers.referer);
})
} else {
req.session.message = {status: 'danger', message: 'Failed to login, check password.'}
res.redirect('/')
}
});
} else {
req.session.message = {status: 'danger', message: 'Failed to login, check username.'}
res.redirect('/')
}
})
}
});
所以它保存資料并重定向到索引,但每次用戶進入索引頁面時,它都會顯示歡迎訊息,它顯然會這樣做,因為變數仍然被定義,所以我的目標是在他們登錄和歡迎后將該變數更改為空訊息顯示一次。
我試過了:
delete req.session.message
但這只是在將變數傳遞給下一個請求之前將其洗掉。
我如何顯示訊息:
<script type="text/javascript">
var message = JSON.parse('<%- JSON.stringify(message) %>');
$(document).ready(function(){
if(message != null) {
$('.toast').addClass('bg-' message.status);
$('.toast-body').html(message.message)
$(".toast").toast('show');
}
});
</script>
我如何渲染資料:
if(req.session.loggedin) {
res.render('index', {
loggedin: true,
data: req.session.data,
message: req.session.message
});
} else {
res.render('index', {
loggedin: false,
data: null,
message: req.session.message
});
}
uj5u.com熱心網友回復:
呈現包含訊息的頁面后,您需要從會話中清除訊息:
if (req.session.loggedin) {
res.render('index', {
loggedin: true,
data: req.session.data,
message: req.session.message
});
} else {
res.render('index', {
loggedin: false,
data: null,
message: req.session.message
});
}
req.session.message = null;
req.session.save();
而且,為了避免在重定向和保存會話之間出現任何競爭條件,在手動保存會話之前不應重定向。問題是,依靠 express-session 的會話自動保存將在您發送 之后嘗試保存會話res.redirect(),但發送res.redirect()告訴瀏覽器立即請求另一個頁面,以便您在自動保存之間設定競爭的會話和來自 的新傳入請求res.redirect()。你不想要那場比賽。您要確保在發出重定向之前已保存會話。所以,我在res.redirect()里面放了一個req.session.save()回呼來避免任何可能的競爭條件:
router.post('/login', function(req, res, next) {
if(req.method == 'POST') {
const username = req.body.username;
const password = req.body.password;
sql.query('SELECT * FROM `users` WHERE `username` = "' username '"', function(err, results) {
if(err) {
req.session.message = {status: 'danger', message: 'Failed to login, check password.'}
res.redirect('/')
} else if (results.length != 0) {
const passw = results[0].password;
bcrypt.compare(password, passw, function(err, result) {
if(result) {
req.session.loggedin = true;
req.session.data = results[0];
req.session.message = {status: 'success', message: `Welcome back, ${username}.`}
req.session.save(function(err) {
res.redirect(req.headers.referer);
})
} else {
req.session.message = {status: 'danger', message: 'Failed to login, check password.'}
req.session.save(() => {
res.redirect('/')
});
}
});
} else {
req.session.message = {status: 'danger', message: 'Failed to login, check username.'}
req.session.save(() => {
res.redirect('/')
});
}
})
}
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/480580.html
