[英]How to use res.render and res.redirect in the same function
我正在開發一個用於用戶登錄的小部件。 基本上,當他們輸入有效的帳戶詳細信息時,我希望它呈現相同的頁面(使用把手)和 state 類似“帳戶已成功驗證”,然后 3 秒后重定向用戶。
這是我當前的代碼
router.post('/auth', (req, res, next) => {
let username = req.body.username;
let password = req.body.password;
if (username && password) {
connection.query('SELECT * FROM accounts WHERE username = ? AND password = ?', [username, password], (error, results, fields) => {
if (results.length > 0) {
req.session.loggedin = true;
req.session.username = username;
res.render('login.hbs', {
access: new hbs.SafeString('<p>Account successfully authenticated!</p>') // Display custom message
});
setTimeout(() => {
res.redirect('/admin'); // Redirect user
}, 3000);
} else {
res.render('login.hbs', {
access: new hbs.SafeString('<p style="font-size: 1.2rem; margin-top: 2rem; color: red; font-weight:700;">Incorrect Username and/or Password!</p>')
});
}
});
} else {
res.render('login.hbs', {
access: 'Please enter Username and Password'
});
}
});
但是,每當我嘗試執行此操作時,我都會收到“在將標頭發送到客戶端后無法設置標頭”,有人可以告訴我 header 系統是什么以及如何解決此問題以獲得所需的結果嗎?
謝謝!
res.redirect()
通過設置Location
HTTP header 來工作。 這些標頭必須在任何內容通過響應正文傳遞給客戶端之前發送。
作為處理此延遲重定向客戶端的替代方法,您可以使用非標准化* Refresh
header,它允許在重定向發生之前指定延遲(以秒為單位)。 只需添加
res.set({'Refresh': '5; url=/admin'});
在調用res.render()
之前。
*它是由 Netscape 早早引入的,並被所有主要瀏覽器采用,因此盡管從未將其納入官方 HTTP 標准,但使用它非常安全。
作為“獎勵”,如果你要在客戶端解決它,你會添加
<meta http-equiv="refresh" content="5; url=/admin"/>
到您返回的 HTML 標記的 header ,其作用完全相同。
正在發生的事情是。 發送響應后,特定請求已關閉。 瀏覽器不再偵聽或連接到同一請求。 因此,在發送響應后, res.redirect()
會在請求關閉時引發錯誤。
你可以做的是你可以傳遞一些標志或類似的東西,並在客戶端處理重定向。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.