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
相关产品推荐
相关产品推荐

