Результаты мутации Apollo GraphQL не обновляются с PostgreSQL, но работают с SQLite - PullRequest
0 голосов
/ 05 мая 2019

Почему я получаю обновленные данные из моего преобразователя обновлений с помощью SQLite, а не postgress?Также я использую Sequelize для ORM, если это имеет значение.

Просто общий вопрос об Apollo и базах данных.В основном у меня есть пользовательский распознаватель обновлений, который обновляет некоторые поля пользователя и возвращает его обратно.При использовании SQLite возвращаемые данные являются надлежащим образом обновленным пользователем.Однако когда я переключаюсь на postgres, данные всегда на 1 обновление отстают?Поэтому, когда я первоначально обновляю пользователя при использовании postgres, ничего не меняется, но в следующий раз, когда я обновляю его, я получаю данные из предыдущего обновления и так далее.Я просто сбит с толку, потому что я не изменил код, только базу данных, которую он использует.Apollo ведет себя по-разному с разными базами данных или postgress ведет себя не так, как sqlite?

// model

"use strict";
module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define(
    "User",
    {
      id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
      firstName: DataTypes.STRING,
      lastName: DataTypes.STRING,
      userType: DataTypes.STRING,
    },
  );

  User.associate = function(models) {
  };
// typeDef

  type User {
    id: ID!
    firstName: String
    lastName: String
    userType: String
    createdAt: String
    updatedAt: String
  }
// resolver

    async updateUser(
      root,
      {
        id,
        firstName,
        lastName,
        userType,
      },
      { models }
    ) {
      models.User.update(
        {
          firstName: firstName,
          lastName: lastName,
          userType: userType,
        },
        {
          where: { id: id }
        }
      );
      return models.User.findByPk(id);
    },
//query

mutation {
  updateEmployee(
    id: 1
    firstName: "testName"
    lastName: "testUpdate"
    employeeID: "12345"
  ){
    id
    firstName
    lastName
    employeeID
    createdAt
    updatedAt
  }
}

1 Ответ

1 голос
/ 05 мая 2019

Вы не ожидаете вызова update, поэтому findByPk возвращает пользователя до того, как вызов update сможет завершиться.

await models.User.update(  // <-- here
  {
    firstName: firstName,
    lastName: lastName,
    userType: userType,
  },
  {
    where: { id: id }
  }
);
return models.User.findByPk(id);

FWIW, если вы используете PostgresВы можете использовать один вызов, указав параметр returning:

const [_, user] = await models.User.update(
  {
    firstName: firstName,
    lastName: lastName,
    userType: userType,
  },
  {
    where: { id: id },
    returning: true,
  }
);
return user;
...