GraphQL и извлечение данных из Oracle DB: запрос отвечает с набором результатов и не попадает в окно преобразователя Graphql

Я новичок в GraphQL.

Начал разработку приложения GraphQL для извлечения данных из базы данных Oracle.

Это очень простое приложение. Запрос отвечает resultset, а результаты можно увидеть в console.log; однако он не попадает в окно graphql (окно ответа / распознавателя). Выдает ошибку

Невозможно вернуть null для не User.email

Я пробовал обещание в соединении оракула. Не уверен, почему он не показывает данные в GraphQL.

UserType.js

module.exports = new GraphQLObjectType({
  name: 'User',

  fields: () => {
    return{
      id: { type: GraphQLID },
      email: { type: new GraphQLNonNull(GraphQLString) }
    }
  }
});

DBConnection.js

module.exports = oraPool => {
  return  {
    getUsers(apiKey){
      return oracledb.createPool(oraConfig).then(function() {
    console.log("Connection Pool created");
    return oracledb.getConnection().then(function(conn) {
      return conn.execute(
        //`SELECT 'User ' || JSON_OBJECT ('id' VALUE id, 'email' VALUE email) FROM users where id = :id`
        `SELECT  * FROM users WHERE id = :id`
        ,[apiKey]).then(result => {
          //console.log(result.metaData);
          console.log(humps.camelizeKeys(result.rows[0]));
          conn.close();
          return humps.camelizeKeys(result.rows[0]);
        })
        .catch(function(err) {
          console.log(err.message);
          return connection.close();
        });
      })
      .catch(function(err) {
        console.error(err.message);
      });
    })
      }
    }
  }

Type.js

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

  fields: {
    user: {
      type: UserType,
      args: {
    key: { type: new GraphQLNonNull(GraphQLString) }
      },
      resolve: (obj, args, { oraPool }) => {
    return oradb(oraPool).getUsers(args.key);
      }

    }
  }
});

person Morgan    schedule 23.05.2019    source источник
comment
Пожалуйста, избегайте удаления и повторной публикации вопросов. Обычно это считается оскорбительным поведением. . Если вы удалили вопрос случайно, вы всегда можете отменить его удаление.   -  person Daniel Rearden    schedule 23.05.2019
comment
@ Дэниел Риарден, Мне плохо. Я хотел поставить более подробную информацию по своему вопросу (новичок в stackoverflow). тоже хотел добавить больше информации - мой вывод console.log похож на [1, '[email protected]']   -  person Morgan    schedule 23.05.2019
comment
Вы можете добавить информацию, отредактировав вопрос. Пожалуйста, не удаляйте и не репостите.   -  person Cody Gray    schedule 24.05.2019


Ответы (1)


Этот код довольно запутанный, рекомендую начать с нуля. Например, вы вызываете createPool каждый раз при выполнении запроса. Вместо этого вы должны создать пул во время инициализации вашего приложения.

Вы сказали, что это будет простое приложение, но оно всегда может расти. Создать с нуля сервер GraphQL нетривиально. Я рекомендую вам помочь с помощью join-monster. К сожалению, join-monster больше не разрабатывается активно. Но он довольно стабилен и намного лучше, чем начинать с нуля. Вот хороший обзор того, как это работает: https://github.com/stems/join-monster/tree/master/src

Недавно я сделал доклад о GraphQL, который вы можете увидеть здесь: https://www.slideshare.net/DanielMcGhan/intro-to-graphql-for-database-developers

Для демонстрации я взял простой шаблон API, описанный в в этой серии блогов и адаптировал его в качестве сервера GraphQL для общих демонстрационных таблиц EMP и DEPT. Вы можете получить доступ к коду здесь: https://www.dropbox.com/s/cnvyrlik7irtbwm/graphql-api.zip?dl=0.

Еще один из моих коллег рассказывает о GraphQL здесь: https://blogs.oracle.com/opal/demo:-graphql-with-node-oracledb

person Dan McGhan    schedule 24.05.2019
comment
См. Также blogs.oracle.com/ опал / - person Christopher Jones; 24.05.2019
comment
Большое спасибо, Дэн. Я большой читатель вашего блога о Nodejs с Oracle. Ваши ссылки здесь помогли мне очистить много вещей с моей стороны. Теперь я больше не вижу этой ошибки. Однако есть один вопрос: есть ли у нас какие-нибудь плагины вроде join-monster случайно для мутаций? - person Morgan; 24.05.2019
comment
Я так не думаю. Хотя с мутациями, вероятно, неплохо написать свои собственные резолверы. На самом деле сложными являются просто запросы, поскольку они могут быть вложенными и относиться к нескольким типам (внешним ключам), что может привести к сложному динамическому SQL. - person Dan McGhan; 24.05.2019
comment
Спасибо @DanMcGhan. На запрос дан ответ и решены все мои проблемы. - person Morgan; 25.05.2019
comment
@DanMcGhan, я сейчас отправляю это в продакшн. Хотел бы кое-что о Join-Monster. Есть ли способ использовать подсказки оракула в операторах выбора. Как мы можем улучшить производительность объединений? Заранее спасибо. Если нужно, могу открыть новый вопрос. - person Morgan; 30.05.2019
comment
Я не думаю, что вы можете использовать подсказки с кодом, который я предоставил. Однако sqlTable может быть выражением, которое генерирует таблицу: join-monster .readthedocs.io / en / latest / map-to-table Я думаю, у вас могут быть подсказки, но я не уверен, что это поможет в вашем случае использования. Это проект с открытым исходным кодом, поэтому я полагаю, вы можете его разветвить и внести изменения по мере необходимости. Здесь рассказывается о производительности запросов: join-monster.readthedocs.io/en / latest / query-scheme Возможно, обратитесь к сопровождающему, чтобы узнать, примет ли он запросы на вытягивание: github.com / GlennMatthys - person Dan McGhan; 30.05.2019