Node.js中调用sendOtp方法返回undefined问题求助
解决Controller接收Model返回值为undefined的问题
我正在使用Node.js和Express.js开发,控制台能获取用户列表,但将数据传递给Model后,Controller里打印结果为undefined。以下是相关代码:
Controller代码
const sendotps = async (req, res) => { var phone_number=req.body.phone_number; const result= await User.sendOtp(phone_number); console.log(result); // 这里打印undefined }
Model代码
static sendOtp(phone_number) { var otp=Math.floor(1000 + Math.random() * 9999); var config = { method: 'get', maxBodyLength: Infinity, url: 'http://2factor.in/API/V1/xxxxxxxx/SMS/+xxxxxxx/'+otp+'/XXXXXXXX', headers: { } }; return axios(config) .then(async function (response) { const sql = "SELECT phoneNumber FROM verifyOtp WHERE phoneNumber = '${phone_number}'"; const [rows, fields] = await pool.execute(sql); if(rows>0) { console.log('total rows are more than zero'+ rows); } else { const sql = `INSERT INTO verifyOtp (phoneNumber, otp, userType) VALUES ("${phone_number}", "${otp}", "2")`; await pool.execute(sql); const sql2 = `SELECT * FROM users WHERE phone_number = '${phone_number}' AND is_registered='1'`; const [rows2, fields2] = await pool.execute(sql2); console.log(rows2); if(rows2>0) { return rows2; } else { return false; } } }) .catch(function (error) { console.log(error); }); }
问题原因及修复方案
模板字符串语法错误
第一个SQL语句用了双引号包裹,导致${phone_number}变量未被解析,查询条件变成字面量字符串,无法匹配数据。
修复:将双引号改为反引号:const sql = `SELECT phoneNumber FROM verifyOtp WHERE phoneNumber = '${phone_number}'`;数组长度判断逻辑错误
rows是数据库返回的数组,直接用rows>0判断是否有数据不严谨,应该通过数组长度判断:if(rows.length > 0) { console.log('total rows are more than zero: ', rows); }同理,
rows2>0也要改成rows2.length > 0。部分分支未返回值
当rows.length > 0的分支执行时,没有任何返回值,导致Promise的最终结果为undefined,这是Controller拿到undefined的核心原因之一。
修复:根据业务需求添加返回值,比如返回已存在的记录:if(rows.length > 0) { console.log('total rows are more than zero: ', rows); return rows; }Catch块未处理异常传递
Catch块仅打印错误,但没有向上抛出异常或返回错误信息,导致axios请求失败时,Controller的await会得到undefined。
修复:在catch中抛出错误,让Controller可以捕获处理:.catch(function (error) { console.log(error); throw error; });SQL注入风险优化(可选)
直接拼接变量到SQL语句存在注入风险,建议改用参数化查询:// 查询verifyOtp示例 const sql = `SELECT phoneNumber FROM verifyOtp WHERE phoneNumber = ?`; const [rows, fields] = await pool.execute(sql, [phone_number]);
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

