Repl.it 未处理的承诺拒绝
Repl.it unhandled promise rejection
我想在 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 时,我都会收到以下错误:
(node:344) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'push' of null
(node:344) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict
(see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:344) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
如果我尝试 GET,res
returns null
- 可能是因为我在执行 POST.
时没有推动任何东西
为什么会发生这种情况,我该如何解决?
promise被拒如何处理?
您收到 UnhandledPromiseRejectionWarning 是因为您无法捕获异步路由中发生的错误。请参阅快速 error handling 指南。您需要附加某种错误处理程序 -
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)
将跳过链中所有剩余的处理程序,除了那些设置为处理错误的处理程序...
为什么承诺被拒绝?
错误发生是因为 m
是 null
而 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
的响应是假的(null
是假的),则使用空数组 []
。
replit/database
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
步骤。
我想在 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 时,我都会收到以下错误:
(node:344) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'push' of null
(node:344) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag
--unhandled-rejections=strict
(see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:344) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
如果我尝试 GET,res
returns null
- 可能是因为我在执行 POST.
为什么会发生这种情况,我该如何解决?
promise被拒如何处理?
您收到 UnhandledPromiseRejectionWarning 是因为您无法捕获异步路由中发生的错误。请参阅快速 error handling 指南。您需要附加某种错误处理程序 -
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)
将跳过链中所有剩余的处理程序,除了那些设置为处理错误的处理程序...
为什么承诺被拒绝?
错误发生是因为 m
是 null
而 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
的响应是假的(null
是假的),则使用空数组 []
。
replit/database
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
步骤。