EJS中渲染req.flash()消息返回空数组无法显示预期内容如何排查
EJS渲染req.flash()返回空数组问题解决方案
常见问题原因
req.flash()是消费型API,同类型消息仅能读取一次,读取后会自动从session中删除。如果你在路由里先打印过req.flash('success')做调试,后续再把值传给模板时就会得到空数组。- 没有正确取flash返回值的第一项:
req.flash(key)的返回值始终是数组,如果你直接把整个数组传给模板的message_success变量,渲染时就会输出[],而非你预期的字符串内容。 - 路由传值逻辑错误:需要确认你渲染模板时,有没有正确把flash内容赋值给模板的
message_success变量,参考正确写法:
// 路由侧正确传值代码 req.flash('success', 'Success upload!') res.render('你的模板文件名', { // 必须取数组第一项,拿到字符串内容传给模板 message_success: req.flash('success')[0] })
- session配置错误:
req.flash依赖express-session或cookie-session中间件才能正常工作,需要确认你已正确注册session中间件,且注册顺序早于flash中间件和路由规则。 - 多次重定向导致消息失效:flash消息仅能跨一次请求生效,如果你存储消息后执行了多次重定向,到最终渲染页面时消息已经被清空。
模板代码优化方案
你可以直接在模板内读取flash内容,避免路由侧重复消费导致的空值问题,优化后模板代码如下:
<% const successMsgList = req.flash('success') %> <% if(successMsgList.length) { %> <div class="alert alert-success alert-dismissible mt-0 mb-1" id="success-alert"> <a href="#" class="close" data-dismiss="alert" aria-label="close">×</a> <strong>Success!</strong> <%= successMsgList[0] %> </div> <br> <% } %>
内容的提问来源于stack exchange,提问作者wyy812
相关产品推荐
相关产品推荐

