2016-08-04 2 views
1

이전 REST API 서비스를 Apollo 서버로 래핑합니다. REST 서비스를 호출하면 2 ~ 3 레벨의 페이로드가 중첩되는 JSON 객체가된다. 예를 들면 다음과 같습니다.Apollo Server - Connector, Resolver 또는 Model에서 REST 결과 구문 분석

{ 
    - MRData: { 
     - CatTable : { 
      - Cats : [] 

그리고 문제를 더욱 복잡하게 만들려면 중첩 패턴과 노드 이름이 각 자원 종점마다 다릅니다. 그래서 내 질문은, 각 리소스 결과는 사용자 지정 조작이 필요하기 때문에, 커넥터, 리졸버 또는 모델에서이를 수행 할 수있는 가장 적합한 곳이 어디인지 확인하십시오. 커넥터에서 수행하는 경우

커넥터

은 다음 사용자 지정 방법은 각 리소스에 대해 필요합니다. 많은 상용구처럼 보입니다.

public fetchCats(resource: string) {  
    return new Promise<any>((resolve, reject) => { 
     request.get(url, (err, resp, body) => { 
     err ? reject(err) : resolve(JSON.parse(body).MRData.CatTable.Cats) 
     }) 
     }) 
    } 

리졸버는

리졸버의 방법은 약속을 수신하지만 결과는 조작 할 수 없습니다

const allCats = (_, params, context) => context.cat.getCats() 
.then((data) => { // to late to manipulate data here }) 

모델

모델은 유망하지만 어떻게 확신하지 보인다 구조화 :

public getCats() { 
    const cats = this.connector.fetchCats('/cats.json'); 
    return cats; 
    } 

아폴로는 REST API와 통합됩니다. 나는이 사건을 다루는 최선의 방법을 발견하기를 고대하고있다.

답변

2

일반적으로 커넥터에서 파싱을 수행하는 것이 좋습니다. 백 엔드의 세부 사항을 추상화해야하기 때문입니다. 커넥터가 백엔드를 통해 추상화되면 기술적으로 적절한 백엔드를 다른 백엔드로 전환 할 수 있어야합니다. 예를 들어, REST API를 쿼리하는 것으로부터 쿼리가 의미있는 데이터베이스로 직접 보내도록 전환 할 수 있습니다.

결과적으로 두 REST API가 동일하지 않으므로 모든 REST API에 대해 새 커넥터를 만들어야합니다.

+0

추상화 계층에서 좋은 점이 생깁니다. 따라서이 특정 REST API는 자원 당 사용자 정의 노드 이름을 작성하므로 각 자원 유형에 대해 fetch() 및 fetchPage()를 빌드하는 것이 해결책입니다. – jboothe

+0

아니면 fetch()와 같이 resource_type 인수를'fetch (url, resourceType)'과 같이 전달한 다음'CAT_TYPE = "MRData.CatTable.Cats"'와'DOG_TYPE = "MRUM.DogTable.Dogs"와 같은 ENUM을 생성하십시오. 각 리소스에 사용할 구문 분석 구조를 정렬합니다. – jboothe