Node.js中SQL查询函数返回undefined/Pending Promise问题求助
解决Node.js异步SQL查询函数返回值问题
你的问题核心在于**con.query是基于回调的异步API,并非Promise**,所以直接用await不会生效,回调里的return也无法传递到外层函数。下面是两种可行的解决方式:
方式一:将回调API包装为Promise
手动把con.query封装成Promise,就能配合async/await正常使用:
async function isUserExist(userName) { const selectUser = 'SELECT * FROM users WHERE user_name = ?'; // 用Promise包裹回调逻辑 const rows = await new Promise((resolve, reject) => { con.query(selectUser, [userName], (err, rows) => { if (err) { reject(err); // 错误时抛出异常 return; } resolve(rows); // 成功时返回查询结果 }); }); // 根据结果返回布尔值(注意:原代码逻辑是无数据返回true,这里按函数名调整为有数据返回true,可按需修改) return rows.length > 0; }
方式二:使用支持Promise的数据库客户端
如果用的是mysql库,建议换成mysql2的Promise版本(多数Node.js数据库库都提供Promise化实现),无需手动封装:
首先安装依赖:
npm install mysql2
初始化连接时使用Promise版本:
const mysql = require('mysql2/promise'); // 创建连接(或连接池) const con = await mysql.createConnection({ host: '你的数据库地址', user: '用户名', password: '密码', database: '数据库名' });
之后直接在函数中await查询:
async function isUserExist(userName) { const selectUser = 'SELECT * FROM users WHERE user_name = ?'; const [rows] = await con.query(selectUser, [userName]); // mysql2的query返回[结果集, 字段信息] return rows.length > 0; }
调用函数的正确方式
isUserExist是async函数,返回值是Promise,调用时需要用await(在另一个async函数内)或.then():
// 在async函数中调用 async function checkUser() { try { const exists = await isUserExist('testUser'); console.log(exists); // 得到true或false } catch (err) { console.error('查询出错:', err); } } // 或用.then()链式调用 isUserExist('testUser') .then(exists => console.log(exists)) .catch(err => console.error('查询出错:', err));
内容的提问来源于stack exchange,提问作者Hodaya Chayo
相关产品推荐
相关产品推荐

