使用PUT方法更新密码返回成功但数据库未更新问题
如何使用已编写的查询函数实现数据库内用户密码更新
问题现象
前端发起密码更新PUT请求后无报错,正常收到响应{status: 'success', message: 'Updated user'},但数据库内对应邮箱的用户密码未发生实际修改。
相关代码
后端更新接口
async function updatePassword(req, res) { return db.none('UPDATE user_account SET password = $1 WHERE email = $2', [req.body.password, req.body.email]) .then(function () { res.status(200) .json({ status: 'success', message: 'Updated user' }); }) .catch(error => { console.log(error) }); }
前端请求逻辑
resetPassword(){ fetch('http://url/example', { method: 'PUT', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email: this.email, password: this.passwordReset, }), }) // 解析响应为JSON .then(response => response.json()) // 打印结果到控制台 .then(json => console.log(json)); },
排查方向与修复方法
- WHERE条件未匹配到目标行:你用的
db.none是pg-promise提供的API,该方法的判定逻辑是“只要SQL执行后不返回结果集就判定为成功”,而UPDATE语句默认不会返回结果集——哪怕WHERE条件匹配到0行数据,执行过程也不会抛错,会正常进入成功回调返回更新成功的提示。遇到这种情况先在接口里打印req.body.email的实际传值,再去数据库手动执行同参数的SELECT查询,确认传入的邮箱和库内存储的值完全一致(重点排查大小写差异、字符串前后多余空格、传值为空/undefined的问题)。如果需要明确感知是否更新到了行,可以替换为db.result方法执行SQL,从返回结果的rowCount字段判断实际更新行数,行数为0时返回“用户不存在”类的提示即可。 - 数据库事务未提交:如果数据库连接配置默认开启手动事务,执行UPDATE语句后没有手动执行
COMMIT提交,修改只会在当前数据库连接的会话中临时生效,连接释放后修改会自动回滚,不会持久化到磁盘。检查数据库连接配置的自动提交开关,排查代码中是否存在手动开启事务后漏写提交逻辑的问题。 - 连错数据库实例:确认后端配置的数据库地址、端口、库名,和你手动查看数据的数据库是同一个实例,避免本地调试连了开发库,转头去测试库/生产库查数据的低级错误。
- 错误处理逻辑不完善:当前代码的catch块仅在控制台打印错误,没有向前端返回错误响应,一旦SQL执行报错,前端要么等待超时,要么无法感知实际失败状态。建议在catch块补充错误返回逻辑,例如
res.status(500).json({status: 'fail', message: '更新失败'})。
补充说明:问题已解决,感谢各位的帮助。
内容的提问来源于stack exchange,提问作者Barre Mathis
相关产品推荐
相关产品推荐

