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

Node.js(Express)操作MySQL遇"await仅在async函数中有效"错误的解决

解决 "await is only valid for async function" 错误的方案

错误根源

你在axios().then()的回调函数里用了await,但这个回调是普通函数(没加async关键字),而await只能在async函数内部使用,这就是报错的直接原因。另外你的SQL语句还有个问题:用单引号包裹字符串的话,没法解析${phone_number}变量,得换成反引号。

修复方案(两种可选)

方案1:给then的回调加上async关键字

直接修改回调函数,补上async,同时修复SQL的模板字符串问题:

static async sendOtp(phone_number) {
    var otp = Math.floor(1000 + Math.random() * 9999);
    var config = {
        method: 'get',
        maxBodyLength: Infinity,
        url: 'http://2factor.in/API/V1/XXXXXXXXXXXXXXXX/SMS/+91XXXXXXXXXX/12345/XXXXXXXX',
        headers: { }
    };
    axios(config)
    .then(async function (response) { // 此处添加async
        // 把单引号换成反引号,才能解析变量
        const sql = `SELECT phoneNumber FROM verifyOtp WHERE phoneNumber = '${phone_number}'`;
        const [rows, fields] = await pool.execute(sql);
        console.log('total rows are '+ rows.length); // 注意:rows是数组,用length判断数量
        if(rows.length > 0)
        {
            //further logic 1
        }
        else
        {
            //further logic 2
        }
     })
    .catch(function (error) {
        return 'error';
    });
}

方案2:用async/await替代.then()(更推荐,代码更整洁)

既然sendOtp已经是async函数,直接用await处理axios请求,避免嵌套回调:

static async sendOtp(phone_number) {
    var otp = Math.floor(1000 + Math.random() * 9999);
    var config = {
        method: 'get',
        maxBodyLength: Infinity,
        url: 'http://2factor.in/API/V1/XXXXXXXXXXXXXXXX/SMS/+91XXXXXXXXXX/12345/XXXXXXXX',
        headers: { }
    };
    try {
        const response = await axios(config);
        // 安全做法:用参数化查询防止SQL注入
        const sql = "SELECT phoneNumber FROM verifyOtp WHERE phoneNumber = ?";
        const [rows, fields] = await pool.execute(sql, [phone_number]);
        console.log('total rows are '+ rows.length);
        if(rows.length > 0)
        {
            //further logic 1
        }
        else
        {
            //further logic 2
        }
    } catch (error) {
        return 'error';
    }
}

额外提醒

别直接把变量拼进SQL语句,容易引发SQL注入攻击,建议用方案2里的参数化查询(用?占位符,把变量放进数组作为第二个参数传给pool.execute)。另外判断查询结果是否有数据,要用rows.length > 0——因为rows是返回的结果数组,直接和0比较会出逻辑问题。

内容的提问来源于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 18:47:23