小背景:
我正在为工作中的同事构建一个 Fantasy FPL 应用程序,这样我们就可以拥有自己的应用程序,并拥有自己的数据和联盟。我在 FE 上使用 Vue.js,在 BE 上使用 GraphQL + Apollo + MongoDB。
为了澄清这个问题:如果可能,我想使用后端的突变从外部 REST API 获取的数据更新我的数据库。
所以我手动向数据库中添加了一些初始数据(其中一些在外部 API 中不存在,如玩家头像),我现在想通过 Query 将一些现有数据字段更新到外部 REST API。即积分,排名,总分等。
我已经成功地进行了查询以从 REST API 获取数据,并使用我在 Apollo 文档中找到的 Apollos RESTDataSource 减少了它:
class LeagueAPI extends RESTDataSource {
constructor() {
super();
this.baseURL = 'https://fantasy.premierleague.com/api/leagues-classic/xxxxxx/standings/';
}
// Makes sure we can call the API(necessary headers)
willSendRequest(request) {
request.headers.set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36");
}
// Reduces data
leagueReducer(league) {
return {
player_id: league.entry || 0,
total: league.total,
player_name: league.player_name,
rank: league.rank,
previous_rank: league.last_rank,
points: league.event_total,
team_name: league.entry_name
}
}
// Get's total league data standings for current season
async getLeagueData() {
try {
const response = await this.get('');
const extractedResponse = response.standings.results
return Array.isArray(extractedResponse)
? extractedResponse.map(league => this.leagueReducer(league))
: [];
}
catch(error) {
console.log('Error in getLeagueData', error)
}
}
}
module.exports = LeagueAPI
在我的回复中,我得到一个包含我想要迭代并相应更新数据库的对象的数组,以便在匹配后始终显示最新数据。
数组中的对象示例:
{
"id": 57643299,
"event_total": 71,
"player_name": "John Doe",
"rank": 1,
"last_rank": 1,
"rank_sort": 1,
"total": 580,
"entry": 10432744,
"entry_name": "Amazing team name"
},
我有一个 updateGameWeek 突变,当我在 Graphiql 操场上使用它时有效,但我想知道是否有办法在后端调用突变?
我将如何做到这一点,因为我需要对其进行多次迭代,因为有许多对象需要根据后端对应的 id 进行更新。
这是一个有效的 updateQuery 示例:
mutation updateGameWeek{
updateGameWeek(player_id: 29729805, input: {
avatar:"somestring"
player_id: 29324805
})
这个突变通过 id 正确地更新了玩家头像,它基本上是我在通过玩家 id 更新整个数据库时想要使用的蓝图。
这也是 GameWeek 对象的外观/定义为:
type GameWeek {
avatar: String
team_id: Int
points: Float
player_name: String
rank: Int
previous_rank: Int
total: Float
player_id: ID!
team_name: String
}
还有上面突变的实际解析器是什么样的:
module.exports = async (_, { id, input }, { models }) => {
try {
const gameWeekToUpdate = await models.GameWeek.findOne({ _player_id: id });
Object.keys(input).forEach(value => {
gameWeekToUpdate[value] = input[value];
});
const updatedGameWeek = await gameWeekToUpdate.save();
return updatedGameWeek;
} catch (error) {
console.log('Error in updateGameWeek Mutation', error)
}
}