Я занимаюсь разработкой приложения с использованием API REST node.js и express для управления бэкэндом базы данных sqlite. Я использую sequelize как форму. До сих пор все работало нормально, но я обнаружил странную ошибку, которую не могу устранить. У меня есть конечная точка игры, которая обрабатывает базовые c настройки игры, например, какая это игра и какой вариант игры, а также флаг, если игра выиграна или есть следующий игрок, необходимый для выполнения действий.
Таким образом, это won и nextPlayerNeeded, как вы уже догадались, логические флаги. Моя модель выглядит следующим образом:
модели / игры. 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;
};
и соответствующий сценарий миграции:
Миграция / игра. 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 контроллер контроллер / 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));
}
};
Теперь самое интересное. Я использую бессонницу в качестве тестового клиента, и я могу обновить экземпляр игрового объекта, чтобы сказать, что он выиграл (true) и что он имеет nextPlayerNeeded (true). Так что выигрыш никогда не должен быть снова изменен на false, потому что игра заканчивается, если выиграл, а флаг 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"
}
Я могу обновить все Строка помечает так часто, как мне нравится, но не булевы.
Буду благодарен за любые подсказки. Спасибо