मैं नोड JS, PostgreSQL और सीक्वेलाइज़ का उपयोग करके एक साधारण ई-कॉमर्स ऐप के बैकएंड के लिए REST API पर काम कर रहा हूं, और मैं' जब मैं शॉपिंग कार्ट में उत्पाद जोड़ने का प्रयास करता हूं तो मुझे Sequelize के साथ एक समस्या का सामना करना पड़ रहा है। यह एक त्रुटि देता है "column Nan does not exist"
प्रारंभ में मैं उपयोगकर्ता आईडी के लिए प्राथमिक कुंजी के रूप में इंटीजर का उपयोग कर रहा था, फिर मैंने उद्देश्य के अनुरूप बेहतर ढंग से UUID के लिए बदल दिया।

मॉडल और माइग्रेशन के लिए मैं जिस कोड का उपयोग कर रहा हूं वह निम्न है:

//User model
export default (sequelize, DataTypes) => {
  const User = sequelize.define(
    'User',
    {
      id: {
        type: DataTypes.UUID,
        defaultValue: DataTypes.UUIDV4,
        allowNull: false,
        primaryKey: true,
        unique: true,
      },
      name: {
        type: DataTypes.STRING,
        allowNull: false
      },
      password: {
        type: DataTypes.STRING,
        allowNull: false
      },
      email: {
        type: DataTypes.STRING,
        allowNull: false,
        unique: {
          name: 'user_email',
          msg: 'A user with this email already exists.'
        }
      },
    },
  User.associate = models => {
    User.hasOne(models.Cart, {
      foreignKey: 'userId',
      as: 'cart',
      onDelete: 'cascade'
    });
  };

  User.associate = models => {
    User.hasMany(models.Order, {
      foreignKey: 'userId',
      as: 'orders',
      onDelete: 'cascade'
    });
  };

  return User;
};

//User migration
export const up = (queryInterface, Sequelize) =>
  queryInterface.createTable('Users', {
    id: {
      type: Sequelize.UUID,
      defaultValue: Sequelize.UUIDV4,
      allowNull: false,
      primaryKey: true,
      unique: true,
    },
    name: {
      allowNull: false,
      type: Sequelize.STRING
    },
    password: Sequelize.STRING,
    email: {
      allowNull: false,
      type: Sequelize.STRING,
      unique: true
    },
    createdAt: {
      allowNull: false,
      type: Sequelize.DATE,
      defaultValue: Sequelize.fn('now')
    },
    updatedAt: {
      allowNull: false,
      type: Sequelize.DATE,
      defaultValue: Sequelize.fn('now')
    },
  });

export const down = queryInterface => queryInterface.dropTable('Users');

कार्ट मॉडल

export default (sequelize, DataTypes) => {
  const Cart = sequelize.define('Cart', {
    id: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
      allowNull: false,
      primaryKey: true,
    },
    userId: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
      allowNull: false
    },
    cartItem: {
      type: DataTypes.TEXT,
      allowNull: false,
      get(value) {
        return JSON.parse(this.getDataValue(value));
      },
      set(value) {
        this.setDataValue('cartItem', JSON.stringify(value));
      }
    }
  });

  Cart.associate = models => {
    Cart.belongsTo(models.User, {
      foreignKey: 'userId',
      as: 'owner'
    });
  };
  return Cart;
};

कार्ट माइग्रेशन

export const up = (queryInterface, Sequelize) =>
  queryInterface.createTable('Carts', {
    id: {
      allowNull: false,
      primaryKey: true,
      type: Sequelize.UUID,
      defaultValue: Sequelize.UUIDV4,
    },
    userId: {
      type: Sequelize.UUID,
      defaultValue: Sequelize.UUIDV4,
      allowNull: false
    },
    cartItem: {
      type: Sequelize.TEXT,
      allowNull: false
    },
    createdAt: {
      allowNull: false,
      type: Sequelize.DATE,
      defaultValue: Sequelize.fn('now')
    },
    updatedAt: {
      allowNull: false,
      type: Sequelize.DATE,
      defaultValue: Sequelize.fn('now')
    }
  });

export const down = queryInterface => queryInterface.dropTable('Carts');

कार्ट में जोड़ने के लिए कोड:

addToCart() {
    return this.asyncWrapper(async (req, res) => {
      const { body, user } = req;

      body.userId = user.id;
      const cart = await this.service.addToCart(body);

      this.sendResponse(res, cart, undefined, 201);
    });
  }

कार्ट सेवा में जोड़ें

async cart(userId, options = {}) {
    const cart = await super.find({ userId }, options);
    return cart;
  }

  async addToCart(data, options) {
    const { userId, productId, qty } = data;

    const [result] = await this.model.findOrCreate({
      where: { userId: +userId },
      defaults: { cartItem: new CartItem() }
    });

    const cartData = JSON.parse(result.dataValues.cartItem);
    const cartItem = new CartItem(cartData);

    const product = await ProductService.getById(productId, { plain: true });

    ExceptionHandler.throwErrorIfNull(product);

    const cart = cartItem.addToCart(product, qty);

    result.cartItem = cart;
    result.save();

    return result;
  }

Sequelize द्वारा उत्पन्न SQL क्वेरी निम्नलिखित है:
SELECT "id","userId","cartItem","createdAt","updatedAt" FROM "Carts" AS "Cart" WHERE "Cart"."userId" = NaN LIMIT 1;

लक्ष्य डेटाबेस में प्राथमिक कुंजी के रूप में UUID का उपयोग करना है। यह समस्या तब शुरू हुई जब मैंने यूयूआईडी के लिए डेटाटाइप को इंटीजर से बदल दिया और मैं नहीं देख सकता कि कोड में क्या गलत है।

इसे कैसे हल करें इस पर कोई सलाह?

Sequelize version: "^5.21.9" with "pg": "^8.2.0" and "pg-hstore": "^2.3.3".
0
AngryDog 27 पद 2020, 06:50
क्या आप अपना मॉडल कोड और उपयोगकर्ता आईडी को क्वेरी में पास करने वाला कोड साझा कर सकते हैं?
 – 
Noah
27 पद 2020, 07:13
मॉडल कोड कार्ट मोड है जो पहले से ही पोस्ट में है। क्वेरी को संभालने के लिए कोड निम्नलिखित है: addToCart() { return this.asyncWrapper(async (req, res) => { const { body, user } = req; body.userId = user.id; const cart = await this.service.addToCart(body); this.sendResponse(res, cart, undefined, 201); }); }
 – 
AngryDog
27 पद 2020, 07:23
this.service.addToCart कोड दिखाएं। और कृपया इसे अपनी पोस्ट में जोड़ें न कि यहां टिप्पणी के रूप में
 – 
Anatoly
27 पद 2020, 11:41
साथ ही आपको User मॉडल में PK फ़ील्ड में unique और defaultValue विकल्पों को इंगित करने की आवश्यकता नहीं है क्योंकि यह पहले से ही एक प्राथमिक कुंजी है (जिसका अर्थ है अद्वितीय) और इसका डिफ़ॉल्ट मान DB द्वारा उत्पन्न होता है। इसके अलावा आपको मॉडल में PK फ़ील्ड में autoIncrement: true इंगित करने की आवश्यकता है ताकि Sequelize को पता चले कि एक डिफ़ॉल्ट मान DB द्वारा उत्पन्न किया जाएगा
 – 
Anatoly
27 पद 2020, 11:44
autoIncrement: true काम नहीं करता क्योंकि मैं यूयूआईडी पहचानकर्ता का उपयोग कर रहा हूं
 – 
AngryDog
27 पद 2020, 18:39

1 उत्तर

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

यदि आपने डेटा प्रकार को INTEGER से UUID में बदल दिया है, तो आपको UUID-string को where: { userId: +userId } करने वाली संख्या में बदलने का प्रयास नहीं करना चाहिए।

userId को इस प्रकार पास करें:

where: { userId }
1
Anatoly 27 पद 2020, 20:57
वो कर गया काम ! शुक्रिया! यह मेरी ओर से एक मूर्खतापूर्ण गलती थी, मैं इस रूपांतरण को बदलना पूरी तरह से भूल गया। अब यह ठीक काम कर रहा है।
 – 
AngryDog
27 पद 2020, 21:21