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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:45:02