repl.it未经处理的承诺拒绝

fnatzsnv  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(459)

我想在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的时候没有推动任何东西。
为什么会发生这种情况,我该如何解决?

vcudknz3

vcudknz31#

如何处理拒绝承诺?
您将收到UnhandledPromisejectionWarning,因为您无法捕获异步路由中发生的错误。请参阅《快速错误处理指南》。您需要附加某种错误处理程序-

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) 将跳过链中所有剩余的处理程序,设置为处理错误的处理程序除外。。。
为什么承诺被拒绝?
发生错误的原因是 mnullnull 没有一个 .push 方法。使命感 null.push(...) 抛出一个错误,该错误导致承诺被拒绝。
为什么 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 这是假的( null 为false),使用空数组, [] 相反
replit/数据库

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

set使用自动编码值 JSON.stringify .
get设计用于检索json字符串并自动解码它们。如果找不到字符串,则 null 返回的值,这就是您的体验。
注意,您可以使用 db.get(someKey, {raw: true}) 要取回原始字符串,请跳过 JSON.parse

相关问题