如何判断布尔变量为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); }); };
额外优化建议
- 合并select参数:把多个
.select()调用合并成一个,代码更简洁。 - 添加状态码:错误返回时加上
400(请求参数错误),成功返回用201(资源创建成功),符合REST规范。 - 传递错误:所有catch块里要调用
next(err),避免错误被吞掉,确保全局错误处理中间件能捕获并处理。 - 使用保存后的文档:用
note.save()返回的savedNote来关联用户,避免原始对象和数据库存储对象的状态不一致。
内容的提问来源于stack exchange,提问作者ReactNativeNoobie
相关产品推荐
相关产品推荐

