मैं एक एसक्लाइट डेटाबेस बैकएंड को प्रबंधित करने के लिए नोड.जेएस और एक्सप्रेस आरईएसटी एपीआई का उपयोग कर एक एप्लीकेशन विकसित कर रहा हूं। मैं एक ओआरएम के रूप में अनुक्रम का उपयोग कर रहा हूं। अब तक सब कुछ ठीक चल रहा था लेकिन मुझे एक अजीब सी त्रुटि का पता चला जिसे मैं हल नहीं कर सकता। मेरे पास एक गेम एंडपॉइंट है जो बुनियादी गेम सेटिंग्स को संभालता है, जैसे कि यह कौन सा गेम है और गेम के किस प्रकार के साथ-साथ एक ध्वज भी है यदि गेम जीता जाता है या अगले खिलाड़ी को कार्रवाई करने की आवश्यकता होती है।

तो यह जीता और nextPlayerNeeded हैं जैसा कि आप पहले से ही बूलियन झंडे का अनुमान लगा सकते हैं। मेरा मॉडल इस तरह दिखता है:

मॉडल/गेम.जेएस:

'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;
};

और संबंधित माइग्रेशन स्क्रिप्ट है,

माइग्रेशन/गेम.जेएस:

'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));
  }
};

अब मज़े वाला हिस्सा आया। मैं एक परीक्षण क्लाइंट के रूप में अनिद्रा का उपयोग कर रहा हूं और मैं यह कहने के लिए तत्काल गेम ऑब्जेक्ट को अपडेट कर सकता हूं कि यह जीता (सत्य) है और इसमें अगलाप्लेयरनीड (सत्य) है। इसलिए जबकि जीता को फिर से झूठे में अपडेट नहीं किया जाना चाहिए क्योंकि खेल खत्म हो गया है अगर झंडा जीता तो अगले खिलाड़ी को अगले खिलाड़ी पर स्विच करने के बाद फिर से झूठा होना चाहिए। लेकिन दोनों में से किसी एक को सही में अपडेट करने से असत्य को फिर से अपडेट करना असंभव हो जाता है। ऐसा क्यों है? मैं उन्हें केवल एक बार फ़ील्ड में अपडेट क्यों कर सकता हूं?

यह उदाहरण के लिए एक अनुरोध से प्रतिक्रिया है जहां मैंने ध्वज को सत्य में अद्यतन किया है:

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

मैं जितनी बार चाहूं सभी स्ट्रिंग झंडे को अपडेट कर सकता हूं, लेकिन बूलियन वाले को नहीं।

मुझे जो भी संकेत मिल सकता है, मैं उसका आभारी रहूंगा। धन्यवाद

1
Patrick Hener 21 जिंदा 2020, 13:48

1 उत्तर

सबसे बढ़िया उत्तर

मैंने अपनी परियोजना को आरईएसटी एपीआई के बजाय ग्राफक्यूएल अपोलो सर्वर और क्लाइंट का उपयोग करने के लिए दोबारा किया। हालांकि दोनों रूपों में मैं ग्राफक्यूएल को अनुक्रमित करने का उपयोग करता हूं, मुझे इसकी आवश्यकता के अनुसार इसे कई बार अपडेट करता है। तो इसे अनुत्तरित लेकिन बंद मानें।

0
Patrick Hener 24 जिंदा 2020, 18:27