GraphQL массив обработки данных JSON - PullRequest
0 голосов
/ 26 января 2019

Я новичок в GraphQL и не совсем уверен, является ли это моей проблемой отсутствия JavaScript или GraphQL.

Мой GraphQL запрашивает внешний сервис, и когда ответом является скалярный объект json, все работает отлично. Проблема возникает, когда внешний сервис возвращает массив json.

Это работает для одного результата json:

const transform = (json) => {
  return {
    id: json.id,
    fullname: json.fullName,
    email: json.email
}

Но для такого массива код отображения неадекватен.

[{id:...fullname:...email:...},{id:...etc},{id:...etc}]

Теперь я могу обнаружить, что возвращаемое значение является массивом, и я могу перебрать массив, просто не зная, как отобразить в GraphQLList.

Итак, после поиска в Google я нашел GraphQLList, но он тоже не работает.

...snip from Schema...
UserData: {
        type: GraphQLLIst(UserType),

тот же код сопоставления, что и выше.

message ":" Ожидается итерируемый, но не найден один для поля RootQueryType.investorData.

Но я в замешательстве, потому что в журнале консоли четко указан массив json?


GraphQLSchema

const RootQueryType = new GraphQLObjectType({
   name: 'RootQueryType',
   fields:{
    investorData: {
        type: new GraphQLList(UserType),
        description: 'Get investors by id',
        args:{key: {type: GraphQLString} },
        resolve: resolveInvestorData
       }
     }
   }
})

1 Ответ

0 голосов
/ 28 января 2019

Проблема решена, но не каким-то гением с моей стороны, а скорее глупой удачей.

Поэтому, добавляя код отображения, я фактически вмешиваюсь в отображение GraphQL.

Это неправильноно размещено здесь для сравнения до и после.

GraphQLSchema:

const RootQueryType = new GraphQLObjectType ({name: 'RootQueryType',

fields: {    
    userData: {
        type: new GraphQLList(UserType),
        args:{key: {type: GraphQLString} },
        resolve: resolveUserData
       }
    }
  }
})

ResolveUserData:

return fetch(url)
   .then(response => {
      return response.json()
      })
   .then(json => {
      return transformUser(json)
      })
   .catch(err => {
      console.trace(err)
     })  
  }

const transformUser = (json) => {
  console.trace(json);
  return {
    id: json.id,
    portfolioid: json.portfolioID,
    fullname: json.fullName,
    email: json.email
   }
}

Правильное сопоставление возвращаемых данных. (Подсказка НЕТ MAPPING)

return fetch(url)
   .then(response => {
      return response.json()
      })
   .catch(err => {
      console.trace(err)
     })  
  }

Теперь это МОЕ окончательное решение, так как я хотел, чтобы одна конечная точка обрабатывалаи один поиск, и запрос «Получить все». Не стесняйтесь комментировать эту архитектуру.

const resolveUserData = (obj, args) => {

let url = '';

//if branch to determine if one user or all
if (typeof args.key === "undefined") {
    url = 'http://localhost:5001/api/users';
}
else
{
    url = 'http://localhost:5001/api/users/' + args.key;
}

return fetch(url)
.then(response => {
  return response.json()
})
.then(json => {
    if(!Array.isArray(json))
    {
        var jarray = [];
        jarray.push(json);
        return jarray;
    }
    return json
})
.catch(err => {
  console.trace(err)
})  

}

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