You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 04:36:55