回复未经处理的承诺拒绝



我想在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);

但每当我尝试POST时,我都会收到以下错误:

(节点:344(未处理的PromiseRetentionWarning:TypeError:无法读取null 的属性"push">

(节点:344(未处理的PromiseRejection警告:未处理的promise拒绝。此错误源于在没有catch块的异步函数内部抛出,或拒绝未使用.catch((处理的promise。要在未处理的prompt拒绝时终止节点进程,请使用CLI标志--unhandled-rejections=strict(请参阅https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。(拒绝id:1(

(节点:344([DEP0018]不推荐使用警告:不推荐使用未经处理的承诺拒绝。将来,未处理的promise拒绝将使用非零退出代码终止Node.js进程。

如果我尝试GET,res会返回null——可能是因为我在执行POST时没有推送任何内容。

为什么会发生这种情况,我该如何解决?

如何处理拒绝承诺

您将收到UnhandledPromiseRetentionWarning,因为您没有任何东西可以捕捉异步路由中发生的错误。请参阅快速错误处理指南。您需要附加某种错误处理程序-

var bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({
extended: true
}))
app.use(bodyParser.json())
app.use(...)
// error handler
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
app.post(...)
app.get(...)
...

next()next(err)的调用指示当前处理程序已完成以及处于何种状态。next(err)将跳过链中除那些设置为处理错误的处理程序之外的所有剩余处理程序。。。

为什么承诺被拒绝

发生错误的原因是mnull,而null没有.push方法。调用null.push(...)会抛出一个错误,导致promise被此错误拒绝。

为什么m具有null

我不知道repl.it API,但可能db.get('leaderboard')没有值,这就是m得到null响应的原因。你可以试着像这个一样修复它

server.get('/leaderboard', async (req, res) => {
const leaderboard = (await db.get('leaderboard')) || [] // <-
res.json(leaderboard);
});
server.post('/leaderboard', async (req, res) => {
const m = (await db.get('leaderboard')) || [] // <-
// ...
});

... || []添加到结果中表示,如果db.get的响应为false(null为false(,则使用空数组[]

复制/数据库

set(key: string, value: any): promise<void>
get(key: string): promise<any | null>
get(key: string, {raw: true}): promise<string | null>

set使用CCD_ 21自动对值进行编码。

get旨在检索JSON字符串并自动对其进行解码。如果没有找到字符串,则返回一个null值,这就是您所经历的。

注意,您可以使用db.get(someKey, {raw: true})返回原始字符串,跳过JSON.parse步骤。

相关内容

最新更新