应使用json格式存储折扣配置,通过同步读取并解析为对象,再按优先级匹配用户与订单上下文条件,最终封装为带校验的独立模块提供加载与匹配功能。
用标准输入输出流读取本地文件中的折扣配置,关键不是“流”本身,而是如何把文件内容(通常是结构化数据)安全、灵活地解析成程序可识别的折扣规则,并支持多级(比如会员等级、商品类别、订单金额区间等)动态匹配。
明确折扣配置的存储格式
标准输入输出流(如 fs.createReadStream / fs.readFileSync)只负责读字节,不理解业务逻辑。所以第一步是约定清晰的配置格式:
-
推荐 JSON 文件:易读、易写、原生支持嵌套,适合表达层级关系。例如:
{ "levels": [ { "level": "vip", "discount": 0.15, "conditions": {"minOrderAmount": 200} }, { "level": "gold", "discount": 0.1, "conditions": {"minOrderAmount": 100, "category": "electronics"} } ] } - 避免纯文本或 CSV 做多级逻辑——解析成本高、容错差;YAML 可行但需额外依赖解析库。
用同步/异步方式安全读取并解析
配置通常启动时加载一次,用同步读取更直观;若需热更新,再考虑监听文件变化 + 异步重载。
- 同步读取(推荐用于初始化):
const fs = require('fs'); const path = require('path'); const configPath = path.join(__dirname, 'discounts.json'); let discountConfig = {}; try { const rawData = fs.readFileSync(configPath, 'utf8'); discountConfig = JSON.parse(rawData); } catch (err) { console.error('折扣配置加载失败:', err.message); // 可降级为默认配置或抛出错误终止 } - 异步读取(适合按需或热更新):
使用fs.promises.readFile+JSON.parse,注意捕获SyntaxError(JSON 格式错误)和文件不存在异常。
构建可匹配的折扣查找逻辑
读出来只是数据,真正“动态”体现在运行时根据用户、订单等上下文匹配最适用的折扣级别。
- 把
discountConfig.levels当作规则列表,按优先级顺序遍历(如 VIP > GOLD > DEFAULT); - 每条规则带
conditions,用简单对象键值比对(如user.level === rule.level),或扩展支持函数式条件(需预编译); - 返回第一个完全匹配的折扣值,或合并多个有效折扣(如满减+会员折上折,需明确定义叠加策略)。
封装成可复用的配置模块
不要在业务代码里到处 require('fs')。抽成独立模块,导出加载器和匹配器:
- 导出
loadDiscountConfig(filePath):负责读取、校验、缓存; - 导出
getApplicableDiscount(context):接收{ user: { level, tags }, order: { amount, category } }等,返回{ discountRate: 0.15, reason: 'vip' }; - 内部做 schema 校验(如用
zod或简单typeof检查),防止配置写错导致运行时异常。











