当前位置: 首页 > 知识库问答 >
问题:

Repl.it未处理的promise拒绝

顾梓
2023-03-14

我想在Repl上为我的游戏实现一个基本的排行榜。它,所以我创建了一个节点。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)UnhandledPromiseRejtionWarning:未处理的promise拒绝。这个错误要么是由于抛出一个没有捕获块的异步函数,要么是由于拒绝了一个没有用. cat()处理的promise。若要在未处理的promise拒绝时终止节点进程,请使用CLI标志--un处理-拒绝=严格(参见https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。(拒绝id: 1)

(节点:344)[DEP0018]弃用警告:未处理的promise拒绝已弃用。将来,未处理的promise拒绝将终止节点。具有非零退出代码的js进程。

如果我尝试获取,res返回null——可能是因为我在执行POST时没有按任何键。

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

共有1个答案

宗安宁
2023-03-14

如何处理拒绝promise?

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

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)表示当前处理程序已完成,并且处于什么状态<代码>下一步(err)将跳过链中所有剩余的处理程序,设置为处理错误的处理程序除外。。。

为什么promise会被拒绝?

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

为什么mnull值?

我不知道答案。它是API,但大概没有db的值。获取(“排行榜”)这就是为什么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的响应为Falsey(null为Falsey),则使用空数组,[]

replit/数据库

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

set使用JSON自动对值进行编码。字符串化

get设计用于检索JSON字符串并自动解码它们。如果找不到字符串,则返回一个null值,这就是您的体验。

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

 类似资料:
  • 当我运行部署我的应用程序的命令时,我发现以下错误 (节点: 6292)UnhandledPromiseRejtionWarning: UnHandledPromiseRejtionWarning: UnHandledPromiseRejtionWarning: UnHandledPromiseRejtionWarning: UnHandledPromiseRejtionWarning: UnHan

  • 为了学习角度2,我正在尝试他们的教程。 我得到这样的错误: 我在SO中浏览了不同的问题和答案,但没有发现什么是“未处理的promise拒绝”。 有人能简单地解释一下它是什么,以及<code>错误:生成cmd ENOENT</code>是什么,当它出现时,我需要检查什么才能消除这个警告吗?

  • 错误: (节点:6772)UnhandledPromiseRejectionWarning:未处理得承诺拒绝.这个错误可能是由于抛出一个没有catch块的异步函数内部,或者是由于拒绝了一个未用.catch()处理的承诺。要在未处理的承诺拒绝时终止节点进程,请使用CLI标志(请参见https://nodejs.org/api/CLI.html#CLI_unhandled_rejections_mod

  • 我正在构建一个SPFx angular 2组件,它有一个嵌套的子组件。子组件需要引用当前上下文,但如果我引用了: 我得到: SPComponentLoader.LoadComponent:错误:***无法从组件“FFAA6A0E-9EBA-40A0-BEC5-226D1DB53CAF”(RequirementsFormWebPart)加载入口点。defaultLoghandler.error@de

  • 我得到这个错误- (节点:18420)未处理的PromisejectionWarning:TypeError:无法读取未定义的属性“name” (节点:18420)未处理的PromisejectionWarning:未处理的promise拒绝。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。catch()。要在未处理的promise拒绝时终止节点进程,请

  • 我试图让Fastif-cookie工作在我的NestJS项目,我收到以下错误: (节点: 38325)未处理的promise拒绝警告:类型错误:无法读取未定义的属性“装饰请求” 未处理的PromisejectionWarning:未处理的promise拒绝。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。catch()。要在未处理的promise拒绝时终