如何在EJS模板中判断存储Buffer数据的MongoDB字段是否为空
判断失效原因
你之前写的post.uploadedImage.length > 0逻辑不生效,核心原因是uploadedImage是Schema定义的嵌套对象类型,不是数组、字符串这类自带length属性的类型,直接访问它的length永远返回undefined,判断结果永远为假,自然走不对分支。
可用的判断方案
要正确识别是否存在有效上传图片,需要同时校验三个条件:
uploadedImage对象本身存在,不是null/undefined- 嵌套的
data字段是有实际内容的Buffer,长度大于0 contentType字段不为空,避免拼接出来的data URI格式错误
直接替换模板中原来的判断语句即可:
<% if (post.uploadedImage && post.uploadedImage.data && post.uploadedImage.data.length > 0 && post.uploadedImage.contentType) { %> <img src="data:image/<%=post.uploadedImage.contentType%>;base64,<%=post.uploadedImage.data.toString('base64')%>" class="img-fluid" /> <% } else { %> <!-- 外链图片回退 --> <img src="<%= post.image%>" class="img-fluid animation fade-in slow" /> <% } %>
可选优化写法
如果觉得模板里的判断语句太长太乱,可以在Express路由层查询完Posts数据后,提前给每条数据加好布尔标识,再传给模板,简化模板逻辑:
// 路由处理逻辑示例 app.get('/blog', async (req, res) => { const posts = await Posts.find({}); // 提前处理判断逻辑 posts.forEach(post => { post.hasValidUploadedImg = !!( post.uploadedImage && post.uploadedImage.data && post.uploadedImage.data.length > 0 && post.uploadedImage.contentType ); }); res.render('blog/index', { Posts: posts, currentUser: req.user }); });
如果你的Node.js版本高于14,也可以用可选链语法简化判断:post.uploadedImage?.data?.length > 0 && post.uploadedImage?.contentType
处理后模板里的判断可以简化成:
<% if (post.hasValidUploadedImg) { %> <!-- 渲染base64上传图 --> <% } else { %> <!-- 渲染回退外链图 --> <% } %>
内容的提问来源于stack exchange,提问作者Andrew Buccellato
相关产品推荐
相关产品推荐

