0

小背景:

我正在为工作中的同事构建一个 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)
    }
}
4

0 回答 0