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

异步函数调用数据库连接串后,API调用报query未定义错误

「query未定义」错误排查与解决

错误根源

  1. 导入对象错误:API.js里你把connect异步函数当成了mysql连接实例导入,函数本身没有query方法,直接调用自然报错。
  2. 异步处理缺失:connect是异步函数,返回的是Promise,必须用await获取实际的数据库连接实例才能执行查询。
  3. 语法错误:mysql query(qry, ...)写法错误,缺少调用方法的点,且应该用连接实例而非函数调用query。

修复后的代码

Dbconnect.js(优化异步调用,调整自执行逻辑)

const mysql = require('mysql2/promise'); // 推荐用mysql2的promise版适配异步语法
const { DefaultAzureCredential } = require("@azure/identity");
const { SecretClient } = require("@azure/keyvault-secrets");

async function connect() {
  const credential = new DefaultAzureCredential();
  const keyVaultName = "dbconnection";
  const url = `https://${keyVaultName}.vault.azure.net`;
  const client = new SecretClient(url, credential);

  // 批量获取密钥,减少异步请求次数
  const [hostSecret, userSecret, dbSecret] = await Promise.all([
    client.getSecret('host'),
    client.getSecret('user'),
    client.getSecret('database')
  ]);

  const connection = await mysql.createConnection({
    host: hostSecret.value,
    user: userSecret.value,
    password: '', // 建议此处也从Key Vault获取密码,不要留空
    database: dbSecret.value,
  });

  console.log('Connection established successfully');
  return connection;
}

// 移除自执行逻辑,由API调用时按需初始化连接
// connect().catch((error) => {
//   console.error("An error occurred:", error);
//   process.exit(1);
// });

module.exports.connect = connect;

API.js(核心修改,修正连接获取与查询逻辑)

const { connect } = require('../DbConnect');
exports.customerInformation = async (req, res) => {
  try {
    // 先获取数据库连接实例
    const dbConnection = await connect();
    const qry = "select * from customerinformation";
    // 用await执行查询(适配mysql2 promise版)
    const [results] = await dbConnection.execute(qry);

    if (results.length > 0) {
      res.status(200).json({response:"200",status:'success',data:results});
    } else {
      res.status(404).json({response:"404",status:'Failed',message:"未找到客户信息"});
    }
    // 用完关闭连接,或改用连接池提升性能
    await dbConnection.end();
  } catch (err) {
    console.error(err);
    res.status(500).json({response:"500",status:'Failed',message:"内部服务器错误"});
  }
};

额外优化建议

  • 改用mysql连接池替代单次连接,避免频繁创建/销毁连接的性能损耗。
  • 数据库密码务必从Azure Key Vault获取,不要明文留空。
  • 坚持使用mysql2/promise库,异步语法更简洁,避免回调嵌套。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:20:42