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

时间:2019-10-22 12:37:05

标签: javascript html node.js

我正在开发用于用户登录的小部件。基本上,当他们输入有效的帐户详细信息时,我希望它呈现相同的页面(使用把手)并声明诸如“帐户已成功验证”之类的内容,然后在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'
        });
    }
});

但是,每当我尝试执行此操作时,都会收到“在将标头发送给客户端后无法设置标头”的消息。有人可以教我一下标头系统是什么以及如何解决此问题以获得所需的结果?

谢谢!

1 个答案:

答案 0 :(得分:3)

bar通过设置res.redirect() HTTP标头来工作。在通过响应正文将任何内容传递给客户端之前,必须先发送这些标头。

作为处理此延迟的重定向客户端的一种替代方法,您可以使用非标准化的Location标头,该标头可以指定发生重定向之前的延迟(以秒为单位)。只需添加

Refresh

在致电res.set({'Refresh': '5; url=/admin'}); 之前。

* 它是Netscape早先引入的,并且已被所有主流浏览器采用,因此,尽管它从未成为正式的HTTP标准,但使用起来还是很安全的。

作为“奖励”,如果要在客户端解决,请添加

res.render()

返回的HTML标记的标头,其功能完全相同。