Выходные поля Datetime в виде строки в запросе GraphQL с использованием Sequelize - PullRequest
0 голосов
/ 25 февраля 2020

Как получить поля MySQL datetime для вывода в виде строк в запросе GraphQL при извлечении данных с помощью Sequelize?

Вот (упрощенная) структура моей таблицы:

CREATE TABLE `things` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `start_date` datetime DEFAULT NULL,
  `creation_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Вот моя (упрощенная) модель Sequelize:

module.exports = function(sequelize, DataTypes) {
    return sequelize.define('things', {
        id: {
            type: DataTypes.INTEGER(10).UNSIGNED,
            allowNull: false,
            primaryKey: true,
            autoIncrement: true
        },
        start_date: {
            type: DataTypes.DATE,
            allowNull: true
        },
        creation_date: {
            type: DataTypes.DATE,
            allowNull: false,
            defaultValue: sequelize.literal('CURRENT_TIMESTAMP')
        },
    }, {
        tableName: 'things',
        timestamps: false
    });
};

А вот мое определение схемы GraphQL:

import { gql } from 'apollo-server-express'
import * as db from '../database'

export const typeDefs = gql`
    extend type Query {
        things: [Thing]
    }

    type Thing {
        id: ID!
        creationDate: String
        startDate: String
    }
`

export const resolvers = {
    Query: {
        things: async () => db.things.findAll(),
    },
}

Когда я запускаю запрос things, я всегда получайте null для полей creationDate и startDate. Я хотел бы получить дату и время в виде строки в формате ISO 8601.

1 Ответ

1 голос
/ 25 февраля 2020

Причина, по которой вы получаете пустое значение, заключается в том, что имя свойства объекта, возвращаемого Sequelize, не соответствует имени вашего поля (creation_date против creationDate). См. этот пост для подробного объяснения.

Несмотря на это, вам все равно нужно будет предоставить собственный распознаватель для форматирования даты. Без этого вы получите дату эпохи. Вы хотите сделать что-то вроде:

const resolvers = {
  Thing: {
    creationDate: (thing) => {
      // thing is an instance of your Sequelize model
      // thing.creation_date is an instance of Date
      return thing.creation_date.toISOString()
    },
  },
}
...