最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

如何在nodejs中执行此代码?用户前后的排行榜排名

运维笔记admin14浏览0评论

如何在nodejs中执行此代码?用户前后的排行榜排名

如何在nodejs中执行此代码?用户前后的排行榜排名

我想在用户之前和之后显示排行榜的排名

文件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 !'}))
    });

运行时

(node:18753) UnhandledPromiseRejectionWarning: RangeError [ERR_HTTP_INVALID_STATUS_CODE]: Invalid status code: undefined
    at ServerResponse.writeHead (_http_server.js:209:11)
    at ServerResponse.writeHead (/root/game/node_modules/on-headers/index.js:44:26)
    at ServerResponse._implicitHeader (_http_server.js:200:8)
    at write_ (_http_outgoing.js:585:9)
    at ServerResponse.end (_http_outgoing.js:702:5)
    at ServerResponse.send (/root/game/node_modules/express/lib/response.js:221:10)
    at ServerResponse.json (/root/game/node_modules/express/lib/response.js:267:15)
    at leaderboard.leaderboarduser.then.catch.err (/root/game/routes.js:152:42)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:18753) 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(). (rejection id: 2)
(node:18753) [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.

我想在用户之前和之后显示排行榜的排名

回答如下:

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

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);
        }
    });
}

问题是您没有正确调用异步函数。也没有捕获块来处理错误。我已经在promise中使用async / await来处理异步数据库调用。然后可以在项目中的某个位置调用此函数:

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

Also limit()用于限制记录数。由于您只需要一条记录,因此应该传递1而不是-1

希望这会有所帮助:)

发布评论

评论列表(0)

  1. 暂无评论