如何用Node.js获取数据库小数?eBay API价格转积分遇NaN问题
问题分析与修复方案
你的代码输出NaN的核心问题出在错误获取汇率值以及冗余的数据库查询上,具体问题点和修复方法如下:
问题点拆解
- 错误赋值汇率变量:
你把connection.query()的返回值(这是一个数据库查询对象,不是查询结果)赋值给了conversionRate,这个对象不是数字类型,执行itemArray[2] / conversionRate时自然会得到NaN。 - 冗余的数据库查询:
已经通过第一个SELECT * FROM Sponsor查询到了赞助商的所有信息,完全没必要再执行一次SELECT PointConversion的重复查询。 - 潜在的数值类型问题:
从数据库取出的PointConversion可能是字符串类型,需要转换为数值后再参与计算。
修复后的代码
request(options, function (error, response) { if (error) throw new Error(error); var parseItem = JSON.parse(response.body); var itemArray = [ parseItem.itemSummaries[0].image, parseItem.itemSummaries[0].title, parseItem.itemSummaries[0].price, parseItem.itemSummaries[0].itemWebUrl ]; // 处理图片链接逻辑保留 itemArray[0] = queryString.stringify(itemArray[0]); itemArray[0] = itemArray[0].substring(9); itemArray[0] = decodeURIComponent(itemArray[0]); // 处理商品价格为数值类型 itemArray[2] = parseFloat(queryString.stringify(itemArray[2])); // 只执行一次数据库查询,获取赞助商信息 connection.query("SELECT * FROM Sponsor WHERE UserId = ?;", [userID], function(error, SponsorInfo, fields) { if (error) throw error; // 检查查询结果是否存在,避免空值报错 if (!SponsorInfo || SponsorInfo.length === 0) { throw new Error("未找到该用户对应的赞助商信息"); } // 取出汇率并转换为数值类型 var conversionRate = parseFloat(SponsorInfo[0].PointConversion); // 检查汇率是否有效(不能为0或非数字) if (isNaN(conversionRate) || conversionRate === 0) { throw new Error("无效的积分转换汇率"); } // 执行积分转换计算(12.5美元 / 0.01汇率 = 1250积分,符合需求) itemArray[2] = itemArray[2] / conversionRate; console.log(itemArray[2]); // 后续跳转逻辑 response.redirect('/sponsor_catalog'); }); });
关键修改说明
- 移除重复查询:直接从第一次查询的
SponsorInfo结果中提取PointConversion字段,减少数据库请求开销。 - 正确获取汇率值:从查询结果数组的第一个元素(
UserId应为唯一值)中取出汇率,通过parseFloat转换为数值类型。 - 增加异常检查:添加查询结果为空、汇率无效的判断,避免后续逻辑出现未知错误。
- 简化价格处理:把两次字符串处理合并为一行,代码更简洁。
内容的提问来源于stack exchange,提问作者drewski
相关产品推荐
相关产品推荐

