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

Node.js中如何让oracledb返回的JSON数值带引号

解决Node.js oracledb数值转字符串输出问题

问题说明

使用Node.js的oracledb包从Oracle数据库获取发票明细数据,输出JSON时数值为数字类型(无引号),需要将所有数值转换为带引号的字符串类型。

当前输出:

{"postage_charge":0,"shipping_charge":52.28,"order_processing":9.82,"receiving_charge":0,"storage_charge":21.36,"product_charge":2.65,"sup_charge":0,"hold_charge":0}

期望输出:

{"postage_charge":"0","shipping_charge":"52.28","order_processing":"9.82","receiving_charge":"0","storage_charge":"21.36","product_charge":"2.65","sup_charge":"0","hold_charge":"0"}

解决方案

方案一:逐个字段转换为字符串

直接在构建result对象时,将每个数值字段转换为字符串类型,可使用String()方法或模板字符串实现:

var result = {
    "postage_charge": String(postageCharge.rows[0].POSTAL_CHARGE ?? 0),
    "shipping_charge": String(shippingCharge.rows[0].SHIPPING_CHARGE ?? 0),
    "order_processing": String(orderProcessing.rows[0].ORDER_CHARGE ?? 0),
    "receiving_charge": String(receivingCharge.rows[0].RECEIVING_CHARGE ?? 0),
    "storage_charge": String(storageCharge.rows[0].STORAGE_CHARGE ?? 0),
    "product_charge": String(productCharge.rows[0].PRODUCT_CHARGE ?? 0),
    "sup_charge": String(supCharge.rows[0].SUP_CHARGE ?? 0),
    "hold_charge": String(holdCharge.rows[0].HOLD_CHARGE ?? 0)
};

方案二:统一遍历转换数值字段

如果需要转换的字段较多,可封装工具函数遍历对象属性,将数值类型统一转为字符串:

function convertNumbersToStrings(obj) {
    const converted = {};
    for (const key in obj) {
        if (typeof obj[key] === 'number') {
            converted[key] = String(obj[key]);
        } else {
            converted[key] = obj[key];
        }
    }
    return converted;
}

// 构建原结果后调用转换函数
var result = {
    "postage_charge": postageCharge.rows[0].POSTAL_CHARGE ?? 0,
    "shipping_charge": shippingCharge.rows[0].SHIPPING_CHARGE ?? 0,
    "order_processing": orderProcessing.rows[0].ORDER_CHARGE ?? 0,
    "receiving_charge": receivingCharge.rows[0].RECEIVING_CHARGE ?? 0,
    "storage_charge": storageCharge.rows[0].STORAGE_CHARGE ?? 0,
    "product_charge": productCharge.rows[0].PRODUCT_CHARGE ?? 0,
    "sup_charge": supCharge.rows[0].SUP_CHARGE ?? 0,
    "hold_charge": holdCharge.rows[0].HOLD_CHARGE ?? 0
};

var convertedResult = convertNumbersToStrings(result);
return res.send(convertedResult);

重要优化:避免SQL注入风险

当前代码使用字符串拼接生成SQL语句(INVOICE_ID='${invoice}'),存在严重SQL注入风险,建议改用绑定变量:
以postageCharge的查询为例,修改为:

postageCharge = await connection.execute(
    `select sum(item_total) as postal_charge from INVOICE_ITEMS where INVOICE_ID = :invoice and charge_type='SHIPPING' and charge_subtype='POSTAGE'`,
    [invoice] // 绑定变量,自动处理字符串转义
);

所有SQL查询都需替换为绑定变量写法,确保代码安全性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:50:21