Node.js读取JSON计算用户积分 处理undefined/null及效率优化问题
可行实现方案
核心优化点
- 采用
fs.promises异步接口读取文件,增加缓存机制避免每次请求重复IO,解决同步读取阻塞线程、效率低的问题 - 增加属性兜底逻辑:初始积分查询为空时默认赋值为0,避免访问undefined属性的报错
- 修正HTTP状态码逻辑:用户不存在时返回404状态码,符合REST接口规范
- 修复回调参数传递错误,对齐预期业务逻辑
完整实现代码
const express = require('express'); const fs = require('fs/promises'); const app = express(); // 缓存文件内容,避免重复读取,若文件需要动态更新可搭配定时刷新逻辑 let stockCache = null; let transactionCache = null; // 预加载文件函数 async function loadFiles() { if (!stockCache) { const stockContent = await fs.readFile('./stock1.json', 'utf8'); stockCache = JSON.parse(stockContent); } if (!transactionCache) { const transactionContent = await fs.readFile('./transactions1.json', 'utf8'); transactionCache = JSON.parse(transactionContent); } return { stock: stockCache, transactions: transactionCache }; } function calculatePoints(userStock, userTransactions) { // 初始积分兜底为0 const initialPoints = userStock ? userStock.points : 0; // 计算plus类型总扣除额 const plusTotal = userTransactions .filter(t => t.type === 'plus') .reduce((prev, curr) => prev + curr.pts, 0); // 计算minus类型总增加额 const minusTotal = userTransactions .filter(t => t.type === 'minus') .reduce((prev, curr) => prev + curr.pts, 0); return initialPoints - plusTotal + minusTotal; } async function getPointsHandler(req, res) { const userId = req.query.userid; if (!userId) { return res.status(400).send('userid parameter is required'); } try { const { stock, transactions } = await loadFiles(); // 查询用户初始积分 const userStock = stock.find(item => item.user === userId); // 查询用户所有交易 const userTransactions = transactions.filter(item => item.user === userId); // 两个文件都不存在对应用户 if (!userStock && userTransactions.length === 0) { return res.status(404).send('user not found'); } const remainingPoints = calculatePoints(userStock, userTransactions); return res.status(200).send(`Here is the number of remaining points: ${remainingPoints}`); } catch (err) { return res.status(500).send('server internal error'); } } // 调整接口路径为和功能匹配的/points,可根据需求修改 app.get('/points', getPointsHandler); app.listen(8000, 'localhost', function () { console.log('Server Listening on http://localhost:8000'); });
逻辑验证
- 用户同时存在于两个文件:按照规则正常计算剩余积分
- 用户仅存在于stock.json:交易部分计算值为0,直接返回初始积分
- 用户仅存在于交易文件:初始积分按0计算,叠加交易规则得到结果
- 用户在两个文件均不存在:返回404状态码和
user not found提示 - 文件读取/解析异常时返回500错误,避免服务崩溃
内容的提问来源于stack exchange,提问作者Maneesh Murali
相关产品推荐
相关产品推荐

