node.js - 如何在这个nodejs代码中执行和处理promise?(用户前后的排行榜排名)
问题描述
我想在用户之前和之后显示排行榜排名。
文件排行榜.js:
exports.leaderboarduser = userName =>
new Promise((resolve, reject) => {
const player = user.findOne({ userName: userName });
const next_player = user
.find({ _id: { $ne: player._id }, score: { $gte: player.score } })
.sort({ score: 1, userName: 1 })
.limit(-1)[0];
const previous_player = user
.find({ _id: { $ne: player._id }, score: { $lte: player.score } })
.sort({ score: -1, userName: -1 })
.limit(-1)[0]
.then(users => {
resolve(users);
})
.catch(err =>
reject({ status: 500, message: "Internal Server Error !" })
);
});
运行时:
此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。(拒绝 ID:2)(节点:18753)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。
我该如何解决这个问题?
解决方案
不确定您是否真的需要多个查询,因为我对您的数据库结构一无所知。这是排序后的代码:
exports.leaderboarduser = (userName) => {
return new Promise(async (resolve, reject) => {
try {
const current_player = await user.findOne({ userName: userName });
const next_playerResult = await user.find({ _id: { $ne: player._id }, score: { $gte: player.score } }).sort({ score: 1, userName: 1 }).limit(1);
const next_player = next_playerResult[0] || {};
const previous_playerResult = await user.find({ _id: { $ne: player._id }, score: { $lte: player.score } }).sort({ score: -1, userName: -1 }).limit(1);
const previous_player = previous_playerResult[0] || {};
resolve([current_player, next_player, previous_player]); // change the order as per requirement
// OR better send an object like: resolve({ current_player, next_player, previous_player });
} catch (err) {
reject(err);
}
});
}
问题是您没有正确调用异步函数。也没有 catch 块来处理错误。我在 Promise 中使用了async/await来处理异步数据库调用。然后在您的项目中的某个地方,您可以将此函数称为:
leaderboarduser('testName')
.then((users) => {
console.log("users are: ", users);
...
// do something with users
})
.catch((err) => {
console.log("Error: ", err);
...
// handle error
});
mongoose中的limit()也用于限制记录数。由于在您的情况下您只需要一条记录,因此您应该通过1而不是-1。
希望这可以帮助 :)
推荐阅读
- python - 在 qTimeEdit 中找不到 valueChanged
- c# - C# UWP 显示图像
- reactjs - 反应JS。如何在创建的侦听器中删除事件侦听器?
- python - 在 Python 中将 CSV 转换为 XLSX 格式时,“'utf-8' 编解码器无法解码位置 0 中的字节 0xff:无效的起始字节”
- javascript - javascript中导入字符串中间的变量连接
- python - 如何在 python 中以 UTF-8 样式编写和编码我的文件?
- javascript - 移动折线图上的圆圈
- android - Android Studio如何为片段内的视图设置约束
- ruby-on-rails - Docker:bash:bundle:找不到命令
- angular - 如何以角度向@Input添加验证?