Node.js+Express数据库取数异常:控制台输出Undefined的解决咨询
问题解决:Express API调用模型方法返回undefined的修复方案
核心问题分析
你的代码存在三个关键问题导致result输出undefined:
- 模型的
sendOtp方法未声明为async,但内部使用了await,导致函数无法正确返回Promise,调用时await拿到的是undefined - SQL语句使用单引号包裹,模板字符串变量
${phone_number}未被解析,引发SQL语法错误 - 判断查询结果的逻辑错误:
rows2是数组,直接用rows2>0会导致判断失效
修正后的完整代码
1. 模型文件(user.model)修正
static async sendOtp(phone_number) { // 使用参数化查询避免SQL注入,同时修复模板字符串语法 const sql2 = "SELECT * FROM users WHERE phone_number = ? AND is_registered = '1'"; try { const [rows2] = await pool.execute(sql2, [phone_number]); // 用数组长度判断是否有查询结果 if (rows2.length > 0) { return rows2; } else { return "notexist"; } } catch (err) { // 抛出错误让上层接口捕获处理 throw err; } }
2. 接口代码优化(增强健壮性)
const sendotps = async (req, res) => { const phone_number = req.body.phone_number?.trim(); // 优化手机号校验逻辑 if (!phone_number || phone_number.length !== 10) { return res.status(400).send({ statusCode: 400, statusMessage: 'Bad Request', message: '请输入有效的10位手机号码', data: null }); } try { const result = await User.sendOtp(phone_number); console.log('result is ', result); if (result !== "notexist") { // 存在用户的后续逻辑 res.status(200).send({ statusCode: 200, statusMessage: 'Success', message: '用户存在', data: result }); } else { // 用户不存在的后续逻辑 res.status(404).send({ statusCode: 404, statusMessage: 'Not Found', message: '用户未注册', data: null }); } } catch (err) { console.error('数据库查询错误:', err); res.status(500).send({ statusCode: 500, statusMessage: 'Internal Server Error', message: '服务器内部错误', data: null, }); } };
关键修复说明
- async函数声明:给
sendOtp加上async关键字,确保它返回Promise,上层接口的await能正确拿到返回值 - 参数化查询:用
?作为占位符,将手机号作为参数传入pool.execute,既修复了变量解析问题,又避免SQL注入风险 - 数组长度判断:用
rows2.length > 0判断是否有查询结果,因为rows2是查询返回的结果数组 - 错误处理:在模型中抛出错误,让上层接口统一捕获处理,方便排查问题
内容的提问来源于stack exchange,提问作者Suzi
相关产品推荐
相关产品推荐

