Node.js中基于MySQL校验手机号/邮箱对应用户存在性时,未找到用户仍返回成功的问题解决
Node.js中基于MySQL校验手机号/邮箱对应用户存在性时,未找到用户仍返回成功的问题解决
老哥,我瞅了你贴的代码,问题其实挺明显的——你现在的逻辑只是执行了查询并返回结果,但完全没判断查询结果里有没有匹配的用户!当数据库里找不到对应手机号或邮箱的记录时,result会是一个空数组,这时候你的接口依然把它当成成功结果返回,自然前端看到的还是"success"状态。
咱们一步步改,先把逻辑捋顺:
第一步:简化模型层的查询代码
你之前手动封装Promise完全没必要,mysql2的pool.query本身就支持async/await,直接用就行,代码更清爽:
// model文件修改后 export async function existing_customer_check(data) { const { email, mobile } = data; // 注意把SQL里的||改成OR,MySQL里OR是标准的逻辑或写法,更稳妥 const register_customer_check_query = `SELECT email , mobile FROM users WHERE email = ? OR mobile = ?`; try { // 直接await调用,解构拿到查询结果 const [result] = await pool.query(register_customer_check_query, [email, mobile]); return result; } catch (error) { throw new Error(`查询用户信息失败:${error.message}`); } }
第二步:在控制器层添加存在性判断逻辑
你之前贴的控制器代码和模型完全重复了,应该是控制器调用模型的查询函数,然后根据结果返回不同的响应:
// controller文件修改后 import { existing_customer_check } from './你的模型文件路径.js'; export async function handleExistingCustomerCheck(req, res) { // 从请求体里获取前端传的手机号/邮箱 const { email, mobile } = req.body; try { const customerList = await existing_customer_check({ email, mobile }); // 核心判断:如果查询结果是空数组,说明用户不存在 if (customerList.length === 0) { return res.status(404).json({ status: "fail", message: "未找到该用户,请检查手机号或邮箱是否正确" }); } // 查到用户的情况,返回成功响应 res.status(200).json({ status: "success", message: "用户存在", data: customerList }); } catch (error) { // 处理数据库查询出错的情况 res.status(500).json({ status: "error", message: error.message }); } }
关键说明
- 核心判断逻辑:MySQL查询无匹配结果时会返回空数组,所以通过
customerList.length === 0就能准确判断用户是否存在。 - 状态码规范:用404表示资源(用户)不存在,200表示成功,500表示服务器内部错误,前端可以根据状态码快速处理不同场景。
- SQL语法优化:把
||改成OR,避免在MySQL的严格模式下出现语法问题,符合SQL标准写法。
备注:内容来源于stack exchange,提问作者MAVEN
相关产品推荐
相关产品推荐

