簡體   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