我想在repl.it上为我的游戏实现一个基本的排行榜,所以我创建了一个node.js后端。这是我在后端的配置:
const express = require('express');
const Client = require('@replit/database');
const db = new Client();
const cors = require('cors');
const bcrypt = require('bcrypt');
const bodyParser = require('body-parser');
const server = express();
server.use(cors());
server.use(bodyParser.json());
server.use(bodyParser.urlencoded({ extended: false }));
server.get('/', (req, res) => {
res.send('Online');
});
server.post('/leaderboard', async (req, res) => {
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);
await db.set('leaderboard', m);
res.send(req.body);
});
server.get('/leaderboard', async (req, res) => {
const leaderboard = await db.get('leaderboard');
res.json(leaderboard);
});
server.listen(3000);
但每当我尝试发布时,都会出现以下错误:
(节点:344)未处理的PromisejectionWarning:typeerror:无法读取null的属性“push”
(节点:344)未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。要在未处理的承诺拒绝时终止节点进程,请使用cli标志 --unhandled-rejections=strict
(见https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (拒绝id:1)
(节点:344)[dep0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止node.js进程。
如果我想得到, res
返回 null
-可能是因为我在做post的时候没有推动任何东西。
为什么会发生这种情况,我该如何解决?
1条答案
按热度按时间vcudknz31#
如何处理拒绝承诺?
您将收到UnhandledPromisejectionWarning,因为您无法捕获异步路由中发生的错误。请参阅《快速错误处理指南》。您需要附加某种错误处理程序-
呼叫
next()
及next(err)
指示当前处理程序已完成以及处于何种状态。next(err)
将跳过链中所有剩余的处理程序,设置为处理错误的处理程序除外。。。为什么承诺被拒绝?
发生错误的原因是
m
是null
及null
没有一个.push
方法。使命感null.push(...)
抛出一个错误,该错误导致承诺被拒绝。为什么
m
有一个null
价值我不知道repl.it api,但它大概没有任何价值
db.get('leaderboard')
这就是为什么m
他得到了一份工作null
答复。你可以试着这样修理它添加
... || []
对结果说如果db.get
这是假的(null
为false),使用空数组,[]
相反replit/数据库
set使用自动编码值
JSON.stringify
.get设计用于检索json字符串并自动解码它们。如果找不到字符串,则
null
返回的值,这就是您的体验。注意,您可以使用
db.get(someKey, {raw: true})
要取回原始字符串,请跳过JSON.parse
步