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键从未被成功初始化写入过,读取自然返回空值。
修复方案
- 读取
leaderboard时做兜底处理,值为null时默认赋值为空数组 - 给路由增加异常捕获逻辑,避免进程崩溃,同时返回合理的错误响应
修改后的接口代码参考:
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
相关产品推荐
相关产品推荐

