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

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

关键修复说明

  1. async函数声明:给sendOtp加上async关键字,确保它返回Promise,上层接口的await能正确拿到返回值
  2. 参数化查询:用?作为占位符,将手机号作为参数传入pool.execute,既修复了变量解析问题,又避免SQL注入风险
  3. 数组长度判断:用rows2.length > 0判断是否有查询结果,因为rows2是查询返回的结果数组
  4. 错误处理:在模型中抛出错误,让上层接口统一捕获处理,方便排查问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:47:38