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

TypeScript中Oracle查询结果无法转为Number格式,仅返回unknown求助

解决TypeScript中Oracle查询结果无法转为number类型的问题

问题根源

  1. showfunds.rows是行数据的数组集合,直接对整个数组调用parseFloat完全不符合方法参数要求,自然无法得到正确数字。
  2. TypeScript无法自动推断Oracle查询返回的rows结构,默认标记为unknown[]类型,直接操作会触发类型报错。

修复方案

按以下逻辑调整代码:

  • 先判断查询结果是否存在有效数据,避免空数组访问报错
  • 取出目标行的WALLET_VALUE字段
  • 显式处理类型转换,兼容数据库返回字符串或数字的情况
  • 增加类型定义让TypeScript识别返回结构

修改后的完整代码

// 定义接口,让TypeScript识别查询结果的结构
interface AccountWallet {
  WALLET_VALUE: number | string;
}

async function withDraw(email: string, password: string, valuetowithdraw: number) {
  OracleDB.outFormat = OracleDB.OUT_FORMAT_OBJECT;

  let connection = await OracleDB.getConnection({
    user: process.env.ORACLE_USER,
    password: process.env.ORACLE_PASSWORD,
    connectString: process.env.ORACLE_CONN_STR
  });

  try {
    // 用泛型指定返回结果类型,消除unknown
    const showfunds = await connection.execute<AccountWallet>(
      `SELECT WALLET_VALUE FROM ACCOUNTS WHERE EMAIL = :email AND PASSWORD = :password`,
      [email, password]
    );

    // 先检查是否查询到账号数据
    if (showfunds.rows.length === 0) {
      throw new Error("账号不存在或密码错误");
    }

    // 取出第一行的钱包金额
    const walletRecord = showfunds.rows[0];
    // 转换为number,兼容数据库返回字符串的情况
    const valueInwallet = typeof walletRecord.WALLET_VALUE === 'string' 
      ? parseFloat(walletRecord.WALLET_VALUE) 
      : walletRecord.WALLET_VALUE;

    // 验证转换后是否为有效数字
    if (isNaN(valueInwallet)) {
      throw new Error("钱包金额格式异常");
    }

    if (valuetowithdraw <= valueInwallet && valuetowithdraw > 0) {
      if (valuetowithdraw <= 100) {
        await connection.execute(
          `UPDATE ACCOUNTS SET WALLET_VALUE = WALLET_VALUE - (:valuetowithdraw * 0.96) WHERE EMAIL = :email AND PASSWORD = :password`,
          [valuetowithdraw, email, password]
        );
        return true;
      }
    }
    return false;
  } finally {
    // 确保数据库连接被释放,避免资源泄漏
    await connection.close();
  }
}

额外说明

  • 加入try/finally块保证连接一定会释放,防止长期占用数据库连接资源
  • 增加空结果和无效数字的判断,避免程序出现未处理的异常
  • 泛型<AccountWallet>的使用让TypeScript能正确推断rows的字段类型,解决unknown类型问题

内容的提问来源于stack exchange,提问作者Gabriel Campos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:45:08