未传入bcrypt参数时无法打印变量的代码调试方法
针对未传入bcrypt参数导致无报错分支异常的调试方法
检查依赖模块的可用性
在使用bcrypt的代码段前,直接打印模块状态:console.log('bcrypt模块状态:', bcrypt);如果输出
undefined,说明bcrypt未被正确传入或导入。也可以在函数开头添加校验逻辑,提前抛出明确错误:if (!bcrypt || typeof bcrypt.compareSync !== 'function') { console.error('bcrypt模块未正确传入'); return res.status(500).json('内部服务错误'); }添加语句级执行日志
在bcrypt.compareSync前后添加日志,确认语句是否执行及变量状态:console.log('准备执行密码校验,密码:', password, '存储的哈希值:', data[0]?.hash); const isValid = bcrypt.compareSync(password, data[0].hash); console.log('密码校验完成,结果:', isValid);如果前一条日志输出,后一条未输出,说明这条语句执行时抛出了同步错误。
细化错误捕获范围
给then回调内的同步代码单独添加try-catch,避免同步错误被外层Promise的catch捕获后混淆报错信息:.then(data => { console.log(data); try { const isValid = bcrypt.compareSync(password, data[0].hash); console.log('isValid:', isValid); if(isValid) { db.select("*") .from("users") .where("email", "=", email) .then(user => { res.json(user[0]) }).catch(err => res.status(400).json("Unable to get User")); } else { res.status(400).json("Wrong credentials !"); } } catch (err) { console.error('密码校验逻辑出错:', err); res.status(500).json('验证逻辑异常'); } }).catch(err => { console.error('数据库查询出错:', err); res.status(400).json("Wrong Credentials"); });这样如果bcrypt不存在,会打印
TypeError: Cannot read properties of undefined (reading 'compareSync')这类明确错误,直接定位问题。使用调试器断点调试
- Node.js环境:用
node --inspect启动服务,通过Chrome的chrome://inspect连接调试器,在const isValid = ...行添加断点,运行到此处时查看bcrypt变量的状态,确认是否存在。 - 浏览器环境:直接在开发者工具的Sources面板找到对应代码行,添加断点,hover查看变量值。
断点调试能直观看到代码执行流程和变量状态,快速定位语句未执行的原因。
- Node.js环境:用
前置参数校验
在函数入口处对所有依赖参数做校验,确保业务逻辑执行前依赖都正常:function loginHandler(req, res, bcrypt) { // 校验bcrypt参数 if (!bcrypt || typeof bcrypt.compareSync !== 'function') { console.error('缺少有效的bcrypt依赖'); return res.status(500).json('内部服务错误'); } // 后续数据库查询及校验逻辑 }
内容的提问来源于stack exchange,提问作者BitFlippa
相关产品推荐
相关产品推荐

