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

如何判断布尔变量为false?Node.js分类校验代码问题求助

问题解决:正确判断布尔变量值并修复笔记保存逻辑

核心错误:布尔值判断逻辑错误

你用if (CategoryExists === -0)完全是错误的写法——Array.some()方法返回的是标准布尔值true或false,不存在-0这种情况。要判断分类不存在(即CategoryExists为false),直接用下面两种写法之一:

// 写法1:逻辑非判断
if (!CategoryExists) {
  return res.status(400).json({ Error: "The category you entered does not exist" });
}

// 写法2:显式判断false
if (CategoryExists === false) {
  return res.status(400).json({ Error: "The category you entered does not exist" });
}

额外问题:笔记保存逻辑中断

你的代码里note.save()之后的User.findById(req.userId)没有返回Promise,导致下一个then回调里的user是undefined,后续的用户笔记关联操作自然无法执行。必须给这个查询加上return,让Promise链正确延续:

note.save()
.then((savedNote) => {
  console.log("saved note");
  return User.findById(req.userId); // 必须return这个Promise
})
.then((user) => {
  creator = user;
  user.notes.push(savedNote); // 用保存后的文档savedNote,而非原始note
  return user.save();
})

修复后的完整代码

exports.postAddNote = (req, res) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    const error = new Error("validation failed, entered data is incorrect");
    throw error;
  }
  const content = req.body.content;
  const tags = req.body.tags;
  const categoryName = req.body.categoryName;
  let creator;
  const note = new Note({
    content: content,
    categoryName: categoryName,
    tags: tags,
    creator: req.userId,
  });
  Category.find()
    .select("-_id -__v -notesId") // 合并select参数,更简洁
    .then((categories) => {
      const CategoryExists = categories.some(
        (category) => category.name === categoryName
      );
      // 正确判断分类不存在
      if (!CategoryExists) {
        return res.status(400).json({ Error: "The category you entered does not exist" });
      } 
      // 延续Promise链,确保后续逻辑执行
      return note.save()
        .then((savedNote) => {
          console.log("saved note");
          return User.findById(req.userId);
        })
        .then((user) => {
          creator = user;
          user.notes.push(savedNote);
          return user.save();
        })
        .then((result) => {
          res.status(201).json({
            info: {
              dateCreated: new Date().toISOString(),
              status: "Note Created Successfully",
              creator: { _id: creator._id, email: creator.email },
            },
          });
        })
        .catch((err) => {
          if (!err.statusCode) {
            err.statusCode = 500;
          }
          next(err); // 传递错误给全局处理中间件
        });
    })
    .catch((err) => {
      console.log(err);
      if (!err.statusCode) {
        err.statusCode = 500;
      }
      next(err);
    });
};

额外优化建议

  1. 合并select参数:把多个.select()调用合并成一个,代码更简洁。
  2. 添加状态码:错误返回时加上400(请求参数错误),成功返回用201(资源创建成功),符合REST规范。
  3. 传递错误:所有catch块里要调用next(err),避免错误被吞掉,确保全局错误处理中间件能捕获并处理。
  4. 使用保存后的文档:用note.save()返回的savedNote来关联用户,避免原始对象和数据库存储对象的状态不一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:00:56