繁体   English   中英

如何在同一个 function 中使用 res.render 和 res.redirect

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM