首页 > 解决方案 > 如何在这个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 进程。

我该如何解决这个问题?

标签: node.jsmongodbpromise

解决方案


不确定您是否真的需要多个查询,因为我对您的数据库结构一无所知。这是排序后的代码:

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

希望这可以帮助 :)


推荐阅读