如何在重定向后 res.render/send 一个变量?

How to res.render/send a variable after a redirect?

我想发送一个消息变量,在不使用通行证或会话的情况下表示成功或失败。

当它失败时,我可以这样做:

res.status(401).render('register', {
    message: 'Your username/email or password is incorrect.'
})

所以我认为这是可能的:

res.redirect('/');
res.render('', { message: 'Login success.'});

但事实并非如此:

Error: Cannot set headers after they are sent to the client

有没有简单的解决办法?

我尝试制作 router.get('/message/redirect :route') 但我意识到我 运行 也遇到了同样的问题。

您正在渲染之前重定向。所以 render 方法不能发送 headers 因为你已经重定向了它们。您需要调用重定向或渲染,而不是同时调用。你可以这样做。

res.render('/', { message: 'Login success.'});

删除此行

res.redirect('/');

在您的 EJS 文件中,只需调用 <%= message %> 即可访问消息。有一种更好的方法来处理 confirmation/error 消息。使用 Flash。

npm install express-flash

然后在渲染之前调用flash。 Flash 有两个参数,消息的名称和消息本身,就像这样

req.flash("MessageName", "Login success");
res.redirect(pathName);

确保使用闪光灯

const flash = require('express-flash');
app = express();
app.use(flash());

app.use((req, res, next) => {
    res.locals.MessageName= req.flash("MessageName");
    next();
});

要访问 EJS 文件中的消息,只需调用 <%= MessageName %>

这是我的代码示例: 在服务器文件中:

req.flash("error", "Something went wrong");
res.redirect('back');

在 EJS 文件中:

<div class="flash">
    <% if(error && error.length > 0){ %> 
        <div class="flash_error">
            <h1 class="flash_error--text"><%= error %></h1> 
        </div>
    <% } %> 
</div>

Read this for more information