如何仅当Express视图引擎传值时展示对应HTML标签,无需重复传null?
方案1:模板层做安全取值(改造成本最低)
EJS 中所有传入模板的变量都会挂载到全局的 locals 对象下,直接访问未定义的顶层变量会抛出引用错误,但访问 locals 下不存在的属性只会返回 undefined 不会报错。你可以直接在模板中这么写:
<%= locals.msg ?? '' %>
如果你用的EJS版本支持空值合并运算符,上面的写法就能做到有msg就输出值,没有就输出空字符串,完全不会报错,不需要修改任何后端路由代码。如果版本不支持,也可以换成三元写法:
<%= typeof msg !== 'undefined' ? msg : '' %>
方案2:全局中间件挂载默认值(适合多页面通用变量场景)
如果很多页面都需要用到msg这类提示变量,可以写一个全局中间件统一给所有模板挂载默认值,不需要每个路由单独传空值:
// 放在所有路由定义之前 app.use((req, res, next) => { // 所有模板默认挂载msg,初始值为空字符串 res.locals.msg = '' // 其他全局通用的模板变量都可以在这里统一添加,比如登录用户信息、站点配置等 next() })
配置完成后,路由渲染时如果传了msg就会覆盖默认值,没传就用默认的空字符串,GET路由不需要做任何修改,直接写res.render('add', {})就可以。
方案3:使用Flash消息(提交提示场景的最优解)
你当前的提交后提示的场景本身就是Flash消息的典型适用场景,用connect-flash中间件可以实现消息存在session中,渲染后自动销毁,还能避免用户刷新页面重复提交表单的问题:
- 先安装依赖:
npm install express-session connect-flash
- 配置中间件:
const session = require('express-session') const flash = require('connect-flash') // 先配置session(根据你的需求调整配置项) app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: false })) app.use(flash()) // 统一把flash消息传递给模板 app.use((req, res, next) => { res.locals.msg = req.flash('msg') next() })
- 改造POST路由:
router.post('/add', (req, res) => { // 接收表单、存数据库逻辑 .then(gig => { // 设置flash消息 req.flash('msg', 'Your application is successful.') // 用重定向代替直接渲染,避免刷新重复提交 res.redirect('/add') }) .catch(err => console.log(err)) })
配置完成后模板直接写<%= msg %>就可以,GET路由不需要传任何参数,刷新页面后提示会自动消失,符合常规交互逻辑。
内容的提问来源于stack exchange,提问作者Intaek
相关产品推荐
相关产品推荐

