点击反转布尔值的链接时参数未更新,status=false无法反转
问题分析与解决方案
问题根源
问题出在字符串转布尔值的逻辑错误:URL的查询参数本质都是字符串类型,当你用Boolean(req.query.status)转换时:
- 传入
status=true时,字符串"true"转布尔结果为true,取反后是false,更新逻辑正常; - 传入
status=false时,非空字符串"false"转布尔结果依然是true,取反后为false——如果数据库中该任务原本状态就是false,更新后状态不会变化,看起来像是反转失败。
解决方案
需要把字符串形式的"true"/"false"正确转换为对应布尔值,替换掉原来的Boolean()转换逻辑:
const Tasks = require('../models/toDoTasks'); module.exports.toggleTask = (req, res) => { (async () => { let taskId = req.query.id; // 正确将字符串参数转为布尔值 let currentStatus = req.query.status === 'true'; await Tasks.updateOne( {_id: taskId}, {completed: !currentStatus} ).then(() => { return res.redirect('/'); }).catch((err) => { console.log(`Error: ${err.message}`); }); })(); }
如果需要兼容大小写(比如传入"TRUE"或"False"),可以使用更严谨的写法:
let currentStatus = req.query.status?.toLowerCase() === 'true';
额外优化建议:可以在更新前添加taskId的有效性校验,避免无效ID触发无意义的数据库操作。
内容的提问来源于stack exchange,提问作者Murugavel.V
相关产品推荐
相关产品推荐

