电商API用户创建POST请求返回200但未生成记录求助
问题排查:POST创建用户返回200但无数据库记录
核心问题分析
从提供的代码来看,主要存在以下几个直接导致问题的原因:
1. 控制器未实现post_register处理逻辑
你导出了post_register函数,但提供的控制器代码里没有这个函数的具体实现。这意味着当POST请求到达时,服务器只是默认返回200 OK,根本没有调用UserProfile.post_register执行创建用户的核心逻辑。
修复建议:
补充控制器的post_register函数,参考put_update的写法实现:
const post_register = (req, res, next) => { const { first_name, last_name, birth_date, gender, home_address, country_of_residence, phone, pword, username } = req.body; UserProfile.post_register( first_name, last_name, birth_date, gender, home_address, country_of_residence, phone, pword, username ) .then((response) => { utils.writeJson(res, response); }) .catch((error) => { // 捕获错误并返回对应状态码,避免默认返回200 utils.writeJson(res, { error: error.message }, 400); }); };
2. 服务层post_register的无反馈分支
当检测到用户名已存在时,函数直接return,没有返回拒绝的Promise,也没有抛出错误。这会导致控制器的then分支被触发,返回空响应(或200),但实际上用户并未创建成功。
修复建议:
在用户名已存在时,返回拒绝的Promise,让控制器捕获并返回错误响应:
const post_register = async ( first_name, last_name, birth_date, gender, home_address, country_of_residence, phone, pword, username ) => { const checkUser = await findByUsername(username); if (checkUser) { console.log(`${username} already exists`); // 返回拒绝的Promise,告知控制器用户已存在 return Promise.reject(new Error(`${username} 已存在`)); } // 后续密码加密、数据库插入逻辑保持不变... };
3. 数据库操作的错误处理冗余
服务层中pool.query的回调里,既rej(error)又throw error是冗余的——throw error在回调内不会被外部捕获,反而可能引发未处理异常。建议移除throw error:
if (error) { rej(error); // 移除该行:throw error; }
4. 顺带提示:更新接口的字段拼写错误
put_update的SQL语句中,字段名写错:home_adress应该是home_address,这会导致更新用户时地址字段无法正确修改,建议修正:
"UPDATE users SET first_name = $1, last_name = $2, birth_date =$3, gender =$4, home_address=$5, country_of_residence = $6, phone = $7, pword = $8, username = $9 WHERE ID = $10"
验证步骤
- 补充控制器的
post_register实现后,重启服务 - 在Postman中发送POST请求,查看控制台是否打印
results.rows(创建成功时会输出新用户数据) - 测试重复用户名的场景,检查是否返回错误响应而非200
内容的提问来源于stack exchange,提问作者Blakjay116
相关产品推荐
相关产品推荐

