在最后一步中,您将获取特定日期的最高分数。此终端节点将返回给定日期和月份的最高分数以及最高总分。
用于获取用户的终端节点为 GET /scores/:date,其中 :date 是格式为 YYYY-MM-DD 的日期。此处理程序代码包含在 application/app.js 中,如下所示:
该处理程序非常简单,因为它将日期参数传递到 fetchTopScores 数据方法中。该方法包含在 application/data/fetchTopScores.js 中。该文件的内容如下:
const redis = require('redis')
const _ = require('lodash')
const client = redis.createClient({
url: `redis://${process.env.REDIS_ENDPOINT}`
})
client.on('error', function(err) {
console.log('Received Redis error:', err)
})
const parseKey = (key) => {
const parts = key.split('|')
return {
username: parts[0],
gamedate: parts[1],
level: parts[2]
}
}
const parseZRevRangeResponse = (resp) => {
const result = _.chunk(resp, 2).map(([key, score]) => {
const obj = parseKey(key)
return {
...obj,
score
}
})
return result
}
const fetchTopScores = async (date) => {
const gametime = new Date(date)
return new Promise((resolve, reject) => {
client.multi()
.zrevrange('Overall Leaderboard', '0', '4', 'WITHSCORES')
.zrevrange(`Monthly Leaderboard|${gametime.getUTCMonth()}-${gametime.getUTCFullYear()}`, '0', '4', 'WITHSCORES')
.zrevrange(`Daily Leaderboard|${gametime.getUTCDay()}-${gametime.getUTCMonth()}-${gametime.getUTCFullYear()}`, '0', '4', 'WITHSCORES')
.exec((err, resp) => {
if (err) {
reject(err)
}
const overall = parseZRevRangeResponse(resp[0])
const weekly = parseZRevRangeResponse(resp[1])
const daily = parseZRevRangeResponse(resp[2])
resolve ({
overall,
weekly,
daily
})
})
})
}
module.exports = fetchTopScores
fetchTopScores 方法将获取日期字符串并将其转换为日期对象。然后,它从 Redis 的相关日期和月份有序集合中获取最高分数,并从总排行榜获取最高分数。它将结果解析为一个结构,在返回结果之前,更便于客户端进行处理。
尝试通过运行以下命令获取最高分数:
{"overall":[{"username":"puzzlemaster","gamedate":"Tue Nov 12 2019 03:21:55 GMT+0000 (Coordinated Universal Time)","level":"48","score":"9901"},{"username":"debbieschneider","gamedate":"2019-11-09T18:41:27","level":"28","score":"9895"},{"username":"alicia39","gamedate":"2019-11-09T10:39:59","level":"47","score":"9824"},{"username":"rosecolleen","gamedate":"2019-11-10T07:09:51","level":"58","score":"9765"},{"username":"allisonsandra","gamedate":"2019-11-07T22:43:32","level":"62","score":"9760"}],"weekly":[{"username":"puzzlemaster","gamedate":"Tue Nov 12 2019 03:21:55 GMT+0000 (Coordinated Universal Time)","level":"48","score":"9901"},{"username":"debbieschneider","gamedate":"2019-11-09T18:41:27","level":"28","score":"9895"},{"username":"alicia39","gamedate":"2019-11-09T10:39:59","level":"47","score":"9824"},{"username":"rosecolleen","gamedate":"2019-11-10T07:09:51","level":"58","score":"9765"},{"username":"allisonsandra","gamedate":"2019-11-07T22:43:32","level":"62","score":"9760"}],"daily":[{"username":"terriross","gamedate":"2019-11-08T21:31:47","level":"26","score":"9386"},{"username":"alicia39","gamedate":"2019-11-08T15:45:30","level":"60","score":"9323"},{"username":"christopherrichardson","gamedate":"2019-11-08T09:51:28","level":"55","score":"9234"},{"username":"castilloanthony","gamedate":"2019-11-08T15:08:32","level":"77","score":"9175"},{"username":"rodriguezjonathan","gamedate":"2019-11-08T13:56:32","level":"46","score":"9155"}]}