GraphQL + Sequalize + существующая база данных - «message»: «parent.getPages не является функцией» для одной модели, а не для другой - PullRequest
0 голосов
/ 10 октября 2019

Запрос GraphQL

Доброе утро,

У меня есть хорошая настройка GraphQL -> Sequalize -> Existing DB (генерируется приложением Laravel). Я построил эту схему:


  type App {
    id: ID!
    userId: ID
    user: User
    pages: [Page]
    experiments: [Experiment]
    uri: String!
    createdAt: String!
    updatedAt: String!
  }
  type Page {
    id: ID!
    userId: ID
    user: User
    appId: ID!
    app: App!
    uri: String!
    createdAt: String!
    updatedAt: String!
  }
  type Experiment {
    id: ID!
    title: String!
    appId: ID!
    app: App!
    createdAt: String!
    updatedAt: String!
  }

На основе существующих данных. Запросы к экспериментам с приложениями работают просто замечательно:

query {
  app(id: 6) {
    id
    title
    experiments {
      id
    }
  }
}
{
  "data": {
    "app": {
      "id": "6",
      "title": "C-Map Embark: Boating",
      "experiments": [
        {
          "id": "1"
        }
      ]
    }
  }
}

Но при запросе страниц я получаю следующее:

query {
  app(id: 6) {
    id
    title
    pages {
      id
    }
  }
}
{
  "errors": [
    {
      "message": "parent.getPages is not a function",
      "locations": [
        {
          "line": 5,
          "column": 5
        }
      ],
      "path": [
        "app",
        "pages"
      ],
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "exception": {
          "stacktrace": [
            "TypeError: parent.getPages is not a function",
    ...

Столбцы БД такие же, как и распознаватели:

/* jshint indent: 2 */

module.exports = function(sequelize, DataTypes) {
  const Page = sequelize.define(
    "page",
    {
      id: {
        type: DataTypes.INTEGER(10).UNSIGNED,
        allowNull: false,
        primaryKey: true,
        autoIncrement: true
      },
    ...
      createdAt: {
        type: DataTypes.DATE,
        allowNull: true
      },
      updatedAt: {
        type: DataTypes.DATE,
        allowNull: true
      }
    },
    {
      tableName: "pages",
      underscored: true
    }
  );

  Page.associate = models => {
    Page.belongsTo(models.app);
  };
  return Page;
};
/* jshint indent: 2 */

module.exports = function(sequelize, DataTypes) {
  const Experiment = sequelize.define(
    "experiment",
    {
      id: {
        type: DataTypes.INTEGER(10).UNSIGNED,
        allowNull: false,
        primaryKey: true,
        autoIncrement: true
      },
        ...
      createdAt: {
        type: DataTypes.DATE,
        allowNull: true
      },
      updatedAt: {
        type: DataTypes.DATE,
        allowNull: true
      }
    },
    {
      tableName: "experiments",
      underscored: true
    }
  );

  Experiment.associate = models => {
    Experiment.belongsTo(models.app);
  };

  return Experiment;
};

Сталкивались ли вы с этим раньше?

...