2017-01-19 4 views
0

Некоторые из моих релейных ребер обрабатываются одинаково, несмотря на то, что они являются разными данными.Края релей, обработанные как те же

Например, я хочу показать список рекомендуемых фильмов. Эти фильмы рекомендуются на основе того факта, что есть актер, которого любит пользователь.

Я ожидаю, что мои данные, чтобы быть как это:

{ 
    "data": { 
    "movies": { 
     "edges": [ 
     { 
      "node": { 
      "name": "Cool Movie 1", 
      "myActor": { 
       "name": "John Smith" 
      } 
      }, 
      "node": { 
      "name": "Cool Movie 1", <- Same as movie above, different actor 
      "myActor": { 
       "name": "Mary Smith" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

Но она возвращает тот же актер, как для узла.

В моем решении () Я возвращаю релейное соединение. В края генерируются так:

let edges = movieIdAndActorIdPairs.map(({movieId, actorId}) => ({ 
     cursor: //, 
     node: async() => { 
      const dataRequirements = [getMovie(movieId), getActor(actorId)] 
      let [movie, actor] = await Promise.all(dataRequirements) 
      movie.myActor = actor 
      return movie 
     } 
})) 

Когда я протоколирует edges это показывает правильный myActor, но при входе в myActor поле на моем Movie типа, они оба становятся John Smith.

+0

Вы проверили, что вы получаете ожидаемое значение для 'actor' * внутри * вашего цикла? (т. е. на сервере, а не на клиенте) – wincent

+0

@wincent Да, я 'console.log' прямо под Promise, а также в методе resolver для поля 'myActor' в моем типе 'Movie', который где код продолжается сразу после возвращения. –

+0

У обоих узлов есть один и тот же идентификатор? выглядит как – marktani

ответ

0

Спасибо всем, что помогли мне.

Я пробовал предлагаемые методы, но не смог получить желаемый набор данных.

Так что я взял этот подход, где actorMovie содержит отдельные поля для actor и movie:

{ 
    "data": { 
    "actorMovies": { 
     "edges": [ 
     { 
      "node": { 
      "movie": { 
       name: "Cool Movie 1", 
      }, 
      "myActor": { 
       "name": "John Smith" 
      } 
      }, 
     } 
     ] 
    } 
    } 
} 

Это устраняет беспокойство перекрывающихся идентификаторов вызывая непреднамеренные группировки.

0

Физическое лицо node не имеет поля id, в результате чего общее значение id для всех узлов (фильмов). Когда хранилище ретрансляции обновляется, в нем хранятся два узла с одинаковым идентификатором и одним и тем же контентом.

Установить идентификатор каждого узла здесь:

node: async() => { 
     const dataRequirements = [getMovie(movieId), getActor(actorId)] 
     let [movie, actor] = await Promise.all(dataRequirements) 
     movie.myActor = actor 
     movie.id = movieId + actorId; 
     return movie 
    } 
+0

Я пробовал это, а также сделал свой курсор комбинацией, подобной '$ {movieId}: $ {actorId}', но все равно кажется, что они относятся к ним одинаково. –

+0

Можете ли вы показать полную функцию разрешения? –