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

Node.js Todo应用:MongoDB存在条目但find()/findOne()仍返回null求助

问题分析与修复方案

核心问题1:异步保存未等待,导致重定向时数据未持久化

你的代码中调用list.save()后立刻执行res.redirect,但save()是异步操作——重定向请求发起时,数据库可能还没完成列表的写入,所以第一次重定向后的查询会找不到数据。即使后续手动刷新,若存在其他问题(比如大小写不匹配),依然会查不到目标条目。

修复方式:必须等待save()完成后再执行重定向,把同步调用改成异步处理:

// 替换原有的list.save()和redirect逻辑
list.save()
  .then(() => {
    console.log(`list with a name of ${customListName} has been created.`);
    res.redirect("/" + list.name);
  })
  .catch(saveErr => {
    console.log("Error saving list ===> " + saveErr);
  });

核心问题2:MongoDB字符串查询默认大小写敏感

如果用户访问的URL大小写不一致(比如第一次访问/Work,后续访问/work),find({ name: customListName })会因为大小写不匹配返回空数组,即使数据库里已有对应数据。

修复方式:统一存储和查询的大小写格式,比如全部转成小写(或大写):

// 处理路由参数,统一转小写
const customListName = req.params.customListName.toLowerCase();

// 创建列表时使用统一后的名称
const list = new List({
  name: customListName,
  items: defaultItems,
});

// 查询时也使用统一后的名称
List.find({ name: customListName })

额外优化:用findOne替代find提升性能

因为你只需要检查单个列表是否存在,用findOne比find更高效,返回的是单个文档而非数组,代码逻辑也更简洁:

app.get("/:customListName", function (req, res) {
  const customListName = req.params.customListName.toLowerCase();
  List.findOne({ name: customListName })
    .then((listFound) => {
      if (!listFound) {
        const list = new List({
          name: customListName,
          items: defaultItems,
        });
        return list.save().then(() => {
          console.log(`list with a name of ${customListName} has been created.`);
          res.redirect("/" + list.name);
        });
      } else {
        res.render("list", {
          listTitle: listFound.name,
          newListItems: listFound.items,
        });
      }
    })
    .catch((err) => {
      console.log("Error faced while handling list ===> " + err);
    });
});

验证步骤

  1. 修复代码后重启服务
  2. 访问一个不存在的列表(比如/TestList),数据库会创建小写的testlist条目
  3. 再次访问/testlist或/TestList,都能正确查询并渲染页面

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 00:13:14