Node.js Oracle库v4.2.0中fetchTypeHandler调试问题
解决方案:node-oracledb 4.2.0 fetchTypeHandler未触发问题
核心原因:未启用结果集模式
fetchTypeHandler仅在使用**结果集(ResultSet)**获取数据时才会触发,而你当前的execute()调用是默认的一次性加载所有结果到内存的模式,这种模式下不会调用该回调函数。
修复步骤
修改execute配置,启用结果集
在opts中添加resultSet: true,让execute返回ResultSet对象而非直接返回所有行:const opts={ fetchAsString : [ oracledb.CLOB ], fetchTypeHandler: function(metaData) { console.log(metaData); if (metaData.dbType == oracledb.DB_TYPE_NUMBER) { const converter = (v) => { if (v !== null) v = parseFloat(v).toFixed(2); return v; }; return {type: oracledb.DB_TYPE_VARCHAR, converter: converter}; } // 非数字类型返回undefined,使用默认处理逻辑 return undefined; }, outFormat : oracledb.OBJECT, autoCommit : true, resultSet: true // 关键:启用结果集模式 };通过结果集获取数据
执行execute后,需要调用ResultSet的getRows()方法获取数据,此时fetchTypeHandler会被触发:const result = await conn.execute(statement, [], opts); const rows = await result.resultSet.getRows(); // 触发fetchTypeHandler await result.resultSet.close(); // 记得关闭结果集
替代方案:SQL层面直接格式化数字
如果不需要流式获取数据,更简单的方式是在查询SQL中直接对数字字段格式化,避免客户端处理的复杂度:
SELECT TO_CHAR(your_number_column, 'FM9999999999999999.99') AS your_number_column FROM your_table
FM用于去除数字前的空格,确保格式符合预期。
额外注意事项
- 确认目标字段确实是
DB_TYPE_NUMBER类型,若为FLOAT等其他数值类型,需调整判断条件(如oracledb.DB_TYPE_FLOAT)。 fetchTypeHandler中对非目标类型字段,建议返回undefined,让驱动使用默认处理逻辑,避免潜在异常。
内容的提问来源于stack exchange,提问作者Andrea Montalbani
相关产品推荐
相关产品推荐

