我正在开发一个用于用户登录的小部件。基本上,当他们输入有效的帐户详细信息时,我希望它呈现相同的页面(使用 Handlebars )并声明“帐户已成功验证”之类的内容,然后 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 发送到客户端后无法设置 header ”有人可以告诉我 header 系统是什么以及如何修复此问题以获得所需的结果吗?
谢谢!
最佳答案
res.redirect()
通过设置 Location
HTTP header 来工作。必须在通过响应正文将任何内容传送到客户端之前发送这些 header 。
作为处理此延迟重定向客户端的替代方法,您可以使用非标准化* Refresh
header ,该 header 允许在重定向发生之前指定延迟(以秒为单位)。只需添加
res.set({'Refresh': '5; url=/admin'});
在调用res.render()
之前。
* 它很早就由 Netscape 引入,并被所有主要浏览器采用,因此尽管从未将其纳入官方 HTTP 标准,但使用它非常安全。
作为“奖励”,如果你要在客户端解决它,你会添加
<meta http-equiv="refresh" content="5; url=/admin"/>
到返回的 HTML 标记的 header ,其作用完全相同。
关于javascript - 如何在同一函数中使用 res.render 和 res.redirect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58504482/