You need to enable JavaScript to run this app. Repl.it Node.js实现排行榜接口报UnhandledPromiseRejection错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Repl.it Node.js实现排行榜接口报UnhandledPromiseRejection错误如何解决

错误成因
  • 核心原因:Repl.it内置数据库读取不存在的key时会返回null。你首次调用POST接口前,数据库中没有leaderboard这个键,await db.get('leaderboard')获取到的m值为null,对null执行push数组方法自然触发类型错误。
  • 附加问题:你的async路由函数没有加异常捕获逻辑,代码报错后没有对应处理逻辑,就会触发Node.js的未处理Promise拒绝警告。GET接口返回null也是因为leaderboard键从未被成功初始化写入过,读取自然返回空值。
修复方案
  1. 读取leaderboard时做兜底处理,值为null时默认赋值为空数组
  2. 给路由增加异常捕获逻辑,避免进程崩溃,同时返回合理的错误响应

修改后的接口代码参考:

server.post('/leaderboard', async (req, res) => {
  try {
    // 不存在时兜底为空数组
    const m = await db.get('leaderboard') || [];
    m.push({
      score: parseInt(req.body.score, 10),
      time: new Date()
    });
    m.sort((a, b) => b.score - a.score);
    // 可选:控制排行榜长度避免体积过大,比如只保留前100条记录
    // const trimmedList = m.slice(0, 100);
    await db.set('leaderboard', m);
    res.status(200).send(req.body);
  } catch (err) {
    console.error('写入排行榜失败:', err);
    res.status(500).json({ error: '写入排行榜失败' });
  }
});

server.get('/leaderboard', async (req, res) => {
  try {
    // 不存在时返回空数组而不是null
    const leaderboard = await db.get('leaderboard') || [];
    res.status(200).json(leaderboard);
  } catch (err) {
    console.error('读取排行榜失败:', err);
    res.status(500).json({ error: '读取排行榜失败' });
  }
});

内容的提问来源于stack exchange,提问作者new Q Open Wid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 16:57:01