मैं नोड 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".
1 उत्तर
यदि आपने डेटा प्रकार को INTEGER
से UUID
में बदल दिया है, तो आपको UUID-string को where: { userId: +userId }
करने वाली संख्या में बदलने का प्रयास नहीं करना चाहिए।
userId
को इस प्रकार पास करें:
where: { userId }
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); }); }
this.service.addToCart
कोड दिखाएं। और कृपया इसे अपनी पोस्ट में जोड़ें न कि यहां टिप्पणी के रूप मेंUser
मॉडल में PK फ़ील्ड मेंunique
औरdefaultValue
विकल्पों को इंगित करने की आवश्यकता नहीं है क्योंकि यह पहले से ही एक प्राथमिक कुंजी है (जिसका अर्थ है अद्वितीय) और इसका डिफ़ॉल्ट मान DB द्वारा उत्पन्न होता है। इसके अलावा आपको मॉडल में PK फ़ील्ड मेंautoIncrement: true
इंगित करने की आवश्यकता है ताकि Sequelize को पता चले कि एक डिफ़ॉल्ट मान DB द्वारा उत्पन्न किया जाएगाautoIncrement: true
काम नहीं करता क्योंकि मैं यूयूआईडी पहचानकर्ता का उपयोग कर रहा हूं