You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
          
        });
    }

问题原因及修复方案

  1. 模板字符串语法错误
    第一个SQL语句用了双引号包裹,导致 ${phone_number} 变量未被解析,查询条件变成字面量字符串,无法匹配数据。
    修复:将双引号改为反引号:

    const sql = `SELECT phoneNumber FROM verifyOtp WHERE phoneNumber = '${phone_number}'`;
    
  2. 数组长度判断逻辑错误
    rows 是数据库返回的数组,直接用 rows>0 判断是否有数据不严谨,应该通过数组长度判断:

    if(rows.length > 0) {
        console.log('total rows are more than zero: ', rows);
    }
    

    同理,rows2>0 也要改成 rows2.length > 0。

  3. 部分分支未返回值
    当 rows.length > 0 的分支执行时,没有任何返回值,导致Promise的最终结果为 undefined,这是Controller拿到undefined的核心原因之一。
    修复:根据业务需求添加返回值,比如返回已存在的记录:

    if(rows.length > 0) {
        console.log('total rows are more than zero: ', rows);
        return rows;
    }
    
  4. Catch块未处理异常传递
    Catch块仅打印错误,但没有向上抛出异常或返回错误信息,导致axios请求失败时,Controller的await会得到undefined。
    修复:在catch中抛出错误,让Controller可以捕获处理:

    .catch(function (error) {
        console.log(error);
        throw error;
    });
    
  5. SQL注入风险优化(可选)
    直接拼接变量到SQL语句存在注入风险,建议改用参数化查询:

    // 查询verifyOtp示例
    const sql = `SELECT phoneNumber FROM verifyOtp WHERE phoneNumber = ?`;
    const [rows, fields] = await pool.execute(sql, [phone_number]);
    

内容的提问来源于stack exchange,提问作者Tony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 02:17:47