Агрегатная функция возвращает null GraphQL

Я тестирую базовую функцию агрегирования, используя счетчики из Sequelize, и вот мой тип Подсчитывает:

type Creserve {
    id: ID!
    rDateStart: Date!
    rDateEnd: Date!
    grade: Int!
    section: String!
    currentStatus: String!
    user: User! 
    cartlab: Cartlab! 
}
type Counts {
    section: String!
    count: Int
}
type Query {
    getBooking(id: ID!): Creserve!
    allBookings: [Creserve]
    getBookingByUser(userId: ID): Creserve
    upcomingBookings: [Creserve]  
    countBookings: [Counts]
}

Я использую countBookings в качестве запроса для агрегатных функций, а вот мой преобразователь для запроса:

countBookings: async (parent, args, {models}) => 
    {
      const res = await models.Creserve.findAndCountAll({
        group: 'section',
        attributes: ['section', [Sequelize.fn('COUNT', 'section'), 'count']]
      });
        return res.rows;
  },

Он выводит следующий запрос:

Executing (default): SELECT "section", COUNT('section') AS "count" FROM "Creserve" AS "Creserve" GROUP BY "section";

И попробовал этот запрос в моей оболочке psql, и он отлично работает:

 section | count
---------+-------
 A       |     2
 R       |     2

Однако, когда я попытался запросить countBookings на своей игровой площадке GraphQL, возвращается секция, но не счетчик:

    {
  "data": {
    "countBookings": [
      {
        "section": "A",
        "count": null
      },
      {
        "section": "R",
        "count": null
      }
    ]
  }
}

Я что-то упустил? Или это ошибка? Это ответ, которому я пытался следовать в этом примере: https://stackoverflow.com/a/45586121/9760036

Большое спасибо!

edit: возврат console.info (res.rows) выводит что-то вроде этого:

   [ Creserve {
    dataValues: { section: 'A', count: '2' },
    _previousDataValues: { section: 'A', count: '2' },
    _changed: {},
    _modelOptions:
     { timestamps: true,
       validate: {},
       freezeTableName: true,
       underscored: false,
       underscoredAll: false,
       paranoid: false,
       rejectOnEmpty: false,
       whereCollection: null,
       schema: null,
       schemaDelimiter: '',
       defaultScope: {},
       scopes: [],
       indexes: [],
       name: [Object],
       omitNull: false,
       hooks: [Object],
       sequelize: [Sequelize],
       uniqueKeys: {} },
    _options:
     { isNewRecord: false,
       _schema: null,
       _schemaDelimiter: '',
       raw: true,
       attributes: [Array] },
    __eagerlyLoadedAssociations: [],
    isNewRecord: false },
  Creserve {
    dataValues: { section: 'R', count: '2' },
    _previousDataValues: { section: 'R', count: '2' },
    _changed: {},
    _modelOptions:
     { timestamps: true,
       validate: {},
       freezeTableName: true,
       underscored: false,
       underscoredAll: false,
       paranoid: false,
       rejectOnEmpty: false,
       whereCollection: null,
       schema: null,
       schemaDelimiter: '',
       defaultScope: {},
       scopes: [],
       indexes: [],
       name: [Object],
       omitNull: false,
       hooks: [Object],
       sequelize: [Sequelize],
       uniqueKeys: {} },
    _options:
     { isNewRecord: false,
       _schema: null,
       _schemaDelimiter: '',
       raw: true,
       attributes: [Array] },
    __eagerlyLoadedAssociations: [],
    isNewRecord: false } ]

Вот для res.count:

Executing (default): SELECT "section", COUNT('section') AS "count" FROM "Creserve" AS "Creserve" GROUP BY "section";
[ { count: '2' }, { count: '2' } ]
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
713
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема

На самом деле вы все делаете прямо здесь ... но здесь происходит то, что sequlize не возвращает простой объект ... Он всегда возвращает данные в форме instance, как это

[ Creserve {
    dataValues: { section: 'A', count: '2' },
    _previousDataValues: { section: 'A', count: '2' },
    _changed: {},
    _modelOptions:
     { timestamps: true,

Решение

I am not sure but there is no other way instead of looping and makes response to json object...

const array = []
res.rows.map((data) => {
  array.push(data.toJSON())
})
return array

Я добавил console.info для res.rows и res.count, и он, кажется, выводит информацию о том, как я хотел, чтобы я его изменил. Как вернуть оба? Извините, я новичок в javascript, я все еще изучаю. И оба счетчика возвращают строку, а не целое число.

James David Bradly Carballo 17.05.2018 05:04

Там. Завершил ответ. Поля в res.rows находятся внутри DataValues.

James David Bradly Carballo 17.05.2018 05:24

Вот результат: Выполнение (по умолчанию): SELECT "section", COUNT ('section') AS "count" FROM "Creserve" AS "Creserve" GROUP BY "section"; {раздел: 'A', количество: '2'}

James David Bradly Carballo 17.05.2018 06:26

Привет, я попробовал, и площадка прочитала ответ. Есть ли способ добавить объекты в массив из этого ответа? Или преобразовать в массив? `` `const array = [{раздел:" A ", count: 2}, {section:" R ", count: 2}]; `` `response:" data ": {" countBookings ": [{" section ":" A "," count ":" 2 "}, {" section ":" R "," count ":" 2 "} ]}}

James David Bradly Carballo 17.05.2018 15:22

Да, этот ответ пришел с GraphQL Playground, поэтому он прочитал массив, который вы дали. И я обнаружил, что выполнение findAndCountAll с последующим подсчетом функций в атрибутах уже является избыточным, поэтому он выполняет подсчет как в res.rows, так и в res.count.

James David Bradly Carballo 17.05.2018 15:52
{ const array = []; const res = await models.Creserve.findAndCountAll({ group: 'section', attributes: ['section', [Sequelize.fn('COUNT', 'section'), 'count']] }).then(response => { return array.push(response.rows[0].toJSON()); }) } Итак, я протестировал, как преобразовать ответ в массив, и я знаю, что это немного запутанный код, но я просто сделаю forEach позже, но да, думаю. Спасибо. Есть ли у вас какие-либо предложения, как сделать это более эффективным?
James David Bradly Carballo 17.05.2018 16:18

Круто, это лучше, чем цикл for, который я сейчас использую. Большое спасибо

James David Bradly Carballo 18.05.2018 04:24

Другие вопросы по теме