如何在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。
希望这会有所帮助:)