Как выполнить и обработать обещание в этом коде nodejs?(рейтинг в рейтинге до и после пользователя) - PullRequest
0 голосов
/ 27 сентября 2019

Я хочу показать рейтинг в таблице лидеров до и после пользователя.

file leaderboard.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 !" })
      );
  });

При запуске:

(узел: 18753) UnhandledPromiseRejectionWarning: RangeError [ERR_HTTP_INVALID_STATUS_CODE]: недопустимый код состояния: не определено в ServerResponse.writeHead (_http_server.js: 209 / game): на сервере (209: игра) на сервереnode_modules / on-headers / index.js: 44: 26) в ServerResponse._implicitHeader (_http_server.js: 200: 8) в write_ (_http_outgoing.js: 585: 9) в ServerResponse.end (_http_outgoing.js: 702: 5) в ServerResponse.send (/root/game/node_modules/express/lib/response.js:221:10) в ServerResponse.json (/root/game/node_modules/express/lib/response.js:267:15) вleaderboard.leaderboarduser.then.catch.err (/root/game/routes.js:152:42) в process._tickCallback (internal / process / next_tick.js: 68: 7) (узел: 18753) UnhandledPromiseRejectionWarning: необработанное отклонение обещания,Эта ошибка возникла либо из-за того, что внутри асинхронной функции возникла ошибка без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch ().(идентификатор отклонения: 2) (узел: 18753) [DEP0018] Предупреждение об устаревании: отклонения необработанного обещания устарели.В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом завершения.

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 27 сентября 2019

Не уверен, если вам действительно нужно несколько запросов, потому что я понятия не имею о вашей структуре базы данных.Вот отсортированный код:

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 для обработки ошибок.Я использовал async / await внутри обещания обрабатывать асинхронные вызовы БД.И тогда где-нибудь в вашем проекте вы можете вызвать эту функцию следующим образом:

leaderboarduser('testName')
    .then((users) => {
        console.log("users are: ", users);
    ...
    // do something with users
})
    .catch((err) => {
        console.log("Error: ", err);
    ...
    // handle error
});

Также limit () в mongoose используется для ограничения количества записей.Поскольку в вашем случае вам нужна только одна запись, вы должны передать 1 , а не -1 .

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...