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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:43:14