EJS模板中无法根据后端布尔值done正确渲染条件内容
解决EJS中布尔值条件判断不生效的问题
看起来你遇到的问题是EJS模板里的photo.done布尔值判断始终走else分支——不管数据库里存的是true还是false,前端都只会显示“Not Selected”。这种情况大概率是数据类型不匹配或者后端传递的数据存在问题,我给你一步步排查和解决的方案:
第一步:先确认photo.done的实际值和类型
首先得搞清楚前端拿到的photo.done到底是什么——很多时候数据库里的布尔值会被转换成字符串(比如"true"/"false"),或者后端传递时没正确处理成JS布尔值。
你可以在EJS循环里临时加一行调试代码:
<% photolist.forEach(function(photo){ %> <!-- 临时调试用,之后可以删掉 --> <td>Debug: <%= photo.done %> | 类型: <%= typeof photo.done %></td> <!-- 原来的表格代码 --> <tr id="<%=photo.id %>" class="gradeX"> ... <%})%>
刷新页面后看这列的输出:
- 如果显示
true | boolean或false | boolean,说明数据类型是对的,需要排查其他问题; - 如果显示
"true" | string或"false" | string,那就是数据类型不匹配导致的判断失效; - 如果显示
undefined | undefined,说明后端传递的photo对象里根本没有done字段,可能是字段名拼写错误或者查询时没包含该字段。
第二步:针对不同情况的解决方案
情况1:photo.done是字符串类型的"true"/"false"
如果调试发现是字符串类型,你可以直接在EJS里明确对比字符串值:
<% if (photo.done === 'true') { %> <td class="center"> Selected</td> <% } else { %> <td class="center"> Not Selected</td> <% } %>
更推荐的做法是在后端提前把字符串转换成布尔值再传递给前端,比如Node.js中:
// 假设从数据库查询到photolist后,处理每个item的done字段 const processedPhotolist = photolist.map(photo => ({ ...photo, done: photo.done === 'true' || photo.done === true })); // 再把processedPhotolist传给EJS模板
情况2:photo.done是undefined/null
这说明后端传递的photo对象里没有done字段,需要检查:
- 数据库里的字段名是否和前端一致(比如是不是叫
is_done而不是done); - 后端查询数据库时是否包含了
done字段; - ORM映射时的字段名是否匹配(比如Mongoose Schema里定义的是
isDone,但数据库里是done)。
情况3:确实是布尔值但判断仍失效
这种情况比较少见,你可以试试强制转换为布尔值再判断:
<% if (Boolean(photo.done)) { %> <td class="center"> Selected</td> <% } else { %> <td class="center"> Not Selected</td> <% } %>
或者用!!运算符强制转布尔:
<% if (!!photo.done) { %> ... <% } %>
修改后的完整EJS代码示例(兼容布尔/字符串两种情况)
<% photolist.forEach(function(photo){ %> <tr id="<%=photo.id %>" class="gradeX"> <td> <a href="/PhotoContestUploads/<%=photo.Photo%>" data-lightbox="example-set" data-title="<%=photo.Description%>"> <img src="/PhotoContestUploads/<%= photo.Photo %>" style="width:100px; height:50px;"> </a> </td> <td name="author"><%= photo.Name %> </td> <td>Win 95+</td> <% // 兼容布尔值和字符串两种情况的判断 %> <% if (photo.done === true || photo.done === 'true') { %> <td class="center"> Selected</td> <% } else { %> <td class="center"> Not Selected</td> <% } %> <td> <% if (!(photo.done === true || photo.done === 'true')) { %> <button class="btn btn-success btn-sm mr-1 mark-complete-btn " id="<%=photo.id %>"> Select as winner</button> <button class="btn btn-info btn-sm mr-1 edit-btn " id="<%=photo.id %>"> <i class="fas fa-edit"></i></button> <button class="btn btn-danger btn-sm mr-1 delete-btn " id="<%=photo.id %>"> Delete</button> <% } %> </td> </tr> <%})%>
内容的提问来源于stack exchange,提问作者pralayasimha Yedida
相关产品推荐
相关产品推荐

