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

Node.js+Express+MongoDB中if语句不执行及findOne返回null排查

问题分析与解决方案

从你的代码和终端输出来看,问题主要出在两个核心点上:严格相等匹配失效导致进入错误分支,以及未处理MongoDB查询结果为null的异常情况。下面逐个拆解并给出解决办法:

1. 为什么listName === 'Today'匹配失败?

终端明明打印了Today,但代码却进入了else分支,这说明看似相同的字符串实际存在细微差异,常见原因有这些:

  • 前后隐藏空格:前端表单提交的list字段值可能带有空格(比如'Today '),而你代码里是纯'Today',严格相等===会因为空格不匹配;
  • 大小写不一致:比如前端传的是全小写的'today',和代码里首字母大写的'Today'不匹配;
  • 表单字段名错误:前端表单的list字段name属性可能拼写错误(比如写成lists),导致req.body.list拿到的不是预期值。

解决办法:

  • 先对listName做清洗,去除前后空格:
    const listName = req.body.list.trim(); // 去除字符串前后的空格、换行符等空白字符
    
  • 若业务允许,改用不区分大小写的匹配:
    if (listName.toLowerCase() === 'today') {
      // 进入Today分支逻辑
    }
    
  • 检查前端表单的name属性,确保和后端req.body.list的字段名完全一致。

2. List.findOne()返回null导致报错

当进入else分支后,如果MongoDB中不存在name为listName的文档,foundList就会是null,这时候直接访问foundList.items必然会抛出TypeError: Cannot read property 'items' of null。你必须先处理错误和查询结果为空的场景。

解决办法:
在回调函数中先判断错误和查询结果是否存在,再执行后续逻辑:

List.findOne({ name : listName }, function(err,foundList){
  // 优先处理数据库查询错误
  if (err) {
    console.log('查询出错:', err);
    return res.status(500).send('服务器查询失败');
  }
  // 判断是否找到对应文档
  if (!foundList) {
    // 如果没找到,创建新的List文档并保存
    const newList = new List({
      name: listName,
      items: [item]
    });
    newList.save();
    res.redirect("/" + listName);
  } else {
    // 找到文档后再执行添加操作
    foundList.items.push(item);
    foundList.save();
    res.redirect("/" + listName);
  }
});

额外优化建议

  • 调试时可以打印listName的长度和原始字符,快速排查隐藏空格:
    console.log('listName:', listName, '长度:', listName.length);
    
  • 建议使用async/await替代回调函数,代码可读性和错误处理会更友好:
    app.post("/", async function (req, res) {
      try {
        const itemName = req.body.newItem;
        const listName = req.body.list.trim();
        const item = new Item({ name: itemName });
    
        if (listName.toLowerCase() === 'today') {
          console.log("进入Today分支");
          await item.save();
          return res.redirect("/");
        }
    
        const foundList = await List.findOne({ name: listName });
        if (!foundList) {
          const newList = new List({ name: listName, items: [item] });
          await newList.save();
        } else {
          foundList.items.push(item);
          await foundList.save();
        }
        res.redirect("/" + listName);
      } catch (err) {
        console.error('请求处理出错:', err);
        res.status(500).send('服务器内部错误');
      }
    });
    

内容的提问来源于stack exchange,提问作者Qazi Saheeb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:32:29