Apollo GraphQL突变结果不随PostgreSQL更新,但与SQLite一起使用

时间:2019-05-05 06:34:50

标签: javascript postgresql apollo apollo-client apollo-server

为什么我要使用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 个答案:

答案 0 :(得分:1)

您不是在等待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;