Express中res.render传递locals参数时EJS变量未定义问题求解
问题根因
你遇到的报错本质是未定义变量直接访问会抛ReferenceError,而访问对象不存在的属性仅返回undefined,不会触发报错,具体对应到你的代码场景有两个核心问题:
- 两个路由传参都缺了对应另一个标记变量
- 访问
/路径时,你仅传入了isIndex: true,没有传入isCreate参数,此时navbar.ejs中直接执行if(isCreate)判断时,isCreate属于完全未声明的变量,直接触发isCreate is not defined报错 - 访问
/create路径时,你仅传入了isCreate: true,没有传入isIndex参数,此时navbar.ejs中判断isIndex时同样会触发未定义报错
- 访问
- 两种变量访问的语法规则差异
你改成res.render('path', { options })后,所有参数都挂载在options对象下,此时访问options.isCreate时,就算options上没有isCreate属性,JS语法规则下只会返回undefined,if判断undefined会直接视为假值走else分支,不会抛出未定义错误,所以能正常运行。
修复方案
你可以任选以下一种方式解决:
- 方式1:每个路由都完整传入两个标记变量,确保变量都被定义
/路由修改为:router.get('/', (req, res) => { res.render('index', { title: '"To do" list', isIndex: true, isCreate: false // 补全缺省的标记 }) })/create路由修改为:router.get('/create', (req, res) => { const options = { title: 'create new "to do"', isCreate: true, isIndex: false // 补全缺省的标记 } res.render('create', options) }) - 方式2:在EJS判断前先检测变量是否存在,避免未定义报错
将navbar.ejs中的判断逻辑修改为:<% if (typeof isIndex !== 'undefined' && isIndex) { %> <li class="active"><a href="/">Todos</a></li> <% } else { %> <li><a href="/">Todos</a></li> <% } %> <% if (typeof isCreate !== 'undefined' && isCreate) { %> <li class="active"><a href="/create">Create</a></li> <% } else { %> <li><a href="/create">Create</a></li> <% } %> - 方式3:沿用你当前的顶层对象封装方案,所有参数都挂载在同一个顶层对象下传递,避免零散变量未定义的问题。
内容的提问来源于stack exchange,提问作者GTB
相关产品推荐
相关产品推荐

