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
相关产品推荐
相关产品推荐

