javascript - 如何在同一函数中使用 res.render 和 res.redirect

标签 javascript html node.js

我正在开发一个用于用户登录的小部件。基本上,当他们输入有效的帐户详细信息时,我希望它呈现相同的页面(使用 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/

相关文章:

Node.js nodemailer 错误 - 错误的版本号/无效的问候语

javascript - 我需要一个带有垂直缩略图和文本的 jquery slider

javascript - 在IOS中实现JS功能

javascript - 在 D3.js 中使用 .style() 方法应用多种样式

javascript - 如何使用 PHP 和 Javascript 通过获取单选按钮值来计算总计?

html - 如何使网页移动?

node.js - Curl 正在获取 POST 响应,但 Node.js 未获取 POST 响应

html - 如何在nodejs中下载托管在http网络服务器上的文件

javascript - 如何更改 Ag-Grid header 大小?

javascript - 请解释一下此代码...?