Продолжить обновление логического API отдыха более одного раза

Я разрабатываю приложение с использованием node.js и REST API для управления серверной частью базы данных sqlite. Я использую sequenceize как форму. До сих пор все работало нормально, но я обнаружил странную ошибку, которую не могу устранить. У меня есть конечная точка игры, которая обрабатывает основные настройки игры, например, какая это игра и какой вариант игры, а также флаг, если игра выиграна или есть следующий игрок, необходимый для выполнения действий.

Таким образом, this выиграл и nextPlayerNeeded, как вы уже догадались, булевы флаги. Моя модель выглядит так:

модели/game.js:

'use strict';
module.exports = (sequelize, DataTypes) => {
  const Game = sequelize.define(
    'Game',
    {
      game: DataTypes.STRING,
      variant: DataTypes.STRING,
      inGame: DataTypes.STRING,
      outGame: DataTypes.STRING,
      won: DataTypes.BOOLEAN,
      nextPlayerNeeded: DataTypes.BOOLEAN
    },
    {}
  );
  Game.associate = function(models) {};
  return Game;
};

и соответствующий сценарий миграции,

миграции/game.js:

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Games', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      game: {
        allowNull: false,
        type: Sequelize.STRING
      },
      variant: {
        allowNull: false,
        type: Sequelize.STRING
      },
      inGame: {
        allowNull: true,
        type: Sequelize.STRING
      },
      outGame: {
        allowNull: true,
        type: Sequelize.STRING
      },
      won: {
        allowNull: false,
        type: Sequelize.BOOLEAN
      },
      nextPlayerNeeded: {
        allowNull: false,
        type: Sequelize.BOOLEAN
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Games');
  }
};

Мой CRUD-контроллер controller/gameController.js выглядит так:

const { Game } = require('../models');
const fs = require('fs');

module.exports = {
  getAllGames(req, res) {
    return Game.findAll({
      attributes: [
        'id',
        'game',
        'variant',
        'inGame',
        'outGame',
        'won',
        'nextPlayerNeeded'
      ]
    })
      .then(games => res.status(200).send(games))
      .catch(err => res.status(400).send(err));
  },
  getSpecificGame(req, res) {
    return Game.findByPk(req.params.id, {
      attributes: [
        'id',
        'game',
        'variant',
        'inGame',
        'outGame',
        'won',
        'nextPlayerNeeded'
      ]
    }).then(game => {
      if (!game) {
        return res.status(404).send({
          message: `Game with id ${req.params.id} not found`
        });
      }
      return res.status(200).send(game);
    });
  },
  createGame(req, res) {
    return Game.create({
      game: req.body.game,
      variant: req.body.variant,
      inGame: req.body.inGame,
      outGame: req.body.outGame,
      won: false,
      nextPlayerNeeded: false
    })
      .then(game => res.status(201).json(game))
      .catch(err => res.status(400).send(err));
  },
  updateGame(req, res) {
    return Game.findByPk(req.params.id, {
      attributes: [
        'id',
        'game',
        'variant',
        'inGame',
        'outGame',
        'won',
        'nextPlayerNeeded'
      ]
    })
      .then(game => {
        if (!game) {
          return res.status(404).send({
            message: `Game with id ${req.params.id} not found`
          });
        }
        return game
          .update({
            game: req.body.game || game.game,
            variant: req.body.variant || game.variant,
            inGame: req.body.inGame || game.inGame,
            outGame: req.body.outGame || game.outGame,
            won: req.body.won || game.won,
            nextPlayerNeeded: req.body.nextPlayerNeeded || game.nextPlayerNeeded
          })
          .then(() => res.status(200).send(game))
          .catch(err => res.status(400).send(err));
      })
      .catch(err => res.status(400).send(err));
  },
  deleteGame(req, res) {
    return Game.findByPk(req.params.id, {
      attributes: [
        'id',
        'game',
        'variant',
        'inGame',
        'outGame',
        'won',
        'nextPlayerNeeded'
      ]
    })
      .then(game => {
        if (!game) {
          return res.status(404).send({
            message: `Game with id ${req.params.id} not found`
          });
        }
        return game
          .destroy()
          .then(() => res.status(204).send())
          .catch(err => res.status(400).send(err));
      })
      .catch(err => res.status(400).send(err));
  }
};

Теперь самое интересное. Я использую insomnia в качестве тестового клиента и могу обновить экземпляр игрового объекта, чтобы сказать, что он выигран (true) и что у него есть nextPlayerNeeded (true). Таким образом, в то время как выигранный никогда не должен снова обновляться до ложного, потому что игра окончена, если выигранный флаг nextPlayerNeeded должен снова быть ложным после переключения на следующего игрока. Но обновление любого из них до true делает невозможным повторное обновление до false. Почему это? Почему я могу обновить их в поле только один раз?

Это, например, ответ на запрос, в котором я обновил флаг до true:

{
  "id": 2,
  "game": "X01",
  "variant": "301",
  "inGame": "Straight",
  "outGame": "Double",
  "won": false,
  "nextPlayerNeeded": true,
  "updatedAt": "2020-01-21T10:47:23.767Z"
}

Я могу обновлять все флаги string так часто, как захочу, но не логические.

Я буду благодарен за любую подсказку, которую я могу получить. Спасибо


person Patrick Hener    schedule 21.01.2020    source источник


Ответы (1)


Я провел рефакторинг своего проекта, чтобы использовать сервер и клиент GraphQL Apollo вместо REST Api. Хотя в обоих вариантах я использую sequenceize GraphQL, я обновляю его несколько раз по мере необходимости. Так что считайте это без ответа, но закрытым.

person Patrick Hener    schedule 24.01.2020