获取 DatabaseError [SequelizeDatabaseError],不正确的整数值
Posted
技术标签:
【中文标题】获取 DatabaseError [SequelizeDatabaseError],不正确的整数值【英文标题】:Getting DatabaseError [SequelizeDatabaseError] ,incorrect integer value 【发布时间】:2020-06-06 15:09:56 【问题描述】:我正在尝试开发一个迷你购物网站,其中我正在使用 NodeJs Express 和 mysql 进行此操作
我的购物车可能有很多产品,每个产品可能属于多个购物车。
因此使用sequelize,我的关系如下:
Cart.belongsToMany(Product, through: CartItem );
Product.belongsToMany(Cart, through: CartItem );
现在 CartItem 是另一个在 carid 和 productid 之间映射的表。
每个表格的设计如下。
产品
const Sequelize = require('sequelize');
const sequelize = require('../util/database');
const Product = sequelize.define('product',
id:
type: Sequelize.INTEGER,
autoIncrement: true,
allowNull: false,
primaryKey: true
,
title: Sequelize.STRING,
price:
type: Sequelize.DOUBLE,
allowNull: false
,
imageUrl:
type: Sequelize.STRING,
allowNull: false
,
description:
type: Sequelize.STRING,
allowNull: false
);
module.exports = Product;
购物车
const Sequelize = require('sequelize');
const sequelize = require('../util/database');
const Cart = sequelize.define('cart',
id:
type: Sequelize.INTEGER,
autoIncrement: true,
allowNull: false,
primaryKey: true
);
module.exports = Cart;
购物车项目
const Sequelize = require('sequelize');
const sequelize = require('../util/database');
const CartItem = sequelize.define('cartItem',
id:
type: Sequelize.INTEGER,
autoIncrement: true,
allowNull: false,
primaryKey: true
,
quantity: Sequelize.INTEGER
);
module.exports = CartItem;
我正在尝试将产品添加到我的购物车。逻辑是检索购物车中所有可用商品的列表。如果我添加的产品已经存在,那么我只是增加数量。否则我重新添加它。
代码如下:
module.exports.postCart = (req, res, next) =>
const prodId = req.body.productId;
let fetchedCart;
let qty=1;
req.user.getCart()
.then(cart =>
fetchedCart = cart;
console.log('cart', cart);
return cart.getProducts(where:id:prodId);
)
.then(products =>
let productInCart;
if (products.length > 0)
productInCart = products[0];
if (productInCart)
const oldQuantity = productInCart.cartItem.quantity;
qty = oldQuantity + 1;
return productInCart;
//console.log(Product.findByPk(prodId));
return Product.findByPk(prodId);
)
.then(product =>
console.log('product',product);
return fetchedCart.addProduct(product,
through: quantity: qty
);
)
.then(() =>
res.redirect('/cart');
)
.catch(err =>
console.log(err);
)
;
问题是每当我尝试将特定产品添加到购物车时,都会出现此错误。我可以在这里看到很多类似用例的解决方案,但与我目前面临的问题无关。
错误堆栈跟踪。
Executing (default): SELECT `id`, `quantity`, `createdAt`, `updatedAt`, `cartId`, `productId` FROM
`cartItems` AS `cartItem` WHERE `cartItem`.`cartId` = 1 AND `cartItem`.`productId` IN ('[object SequelizeInstance:product]');
Executing (default): INSERT INTO `cartItems` (`id`,`quantity`,`createdAt`,`updatedAt`,`cartId`,`productId`) VALUES (NULL,1,'2020-02-22 07:39:45','2020-02-22 07:39:45',1,'[object SequelizeInstance:product]');
DatabaseError [SequelizeDatabaseError]: Incorrect integer value: '[object SequelizeInstance:product]'
for column 'productId' at row 1 at Query.formatError (C:\Users\Aravind\Documents\workspace-VSC\node_modules\sequelize\lib\dialects\mysql\query.js:244:16)
at Query.handler [as onResult] (C:\Users\Aravind\Documents\workspace-VSC\node_modules\sequelize\lib\dialects\mysql\query.js:51:23)
at Query.execute (C:\Users\Aravind\Documents\workspace-VSC\node_modules\mysql2\lib\commands\command.js:30:14)
at Connection.handlePacket (C:\Users\Aravind\Documents\workspace-VSC\node_modules\mysql2\lib\connection.js:417:32)
at PacketParser.onPacket (C:\Users\Aravind\Documents\workspace-VSC\node_modules\mysql2\lib\connection.js:75:12)
at PacketParser.executeStart (C:\Users\Aravind\Documents\workspace-VSC\node_modules\mysql2\lib\packet_parser.js:75:16)
at Socket.<anonymous> (C:\Users\Aravind\Documents\workspace-VSC\node_modules\mysql2\lib\connection.js:82:25)
at Socket.emit (events.js:210:5)
at addChunk (_stream_readable.js:309:12)
at readableAddChunk (_stream_readable.js:290:11)
at Socket.Readable.push (_stream_readable.js:224:10)
at TCP.onStreamRead (internal/stream_base_commons.js:182:23)
name: 'SequelizeDatabaseError',
parent: Error: Incorrect integer value: '[object SequelizeInstance:product]' for column 'productId' at row 1
at Packet.asError (C:\Users\Aravind\Documents\workspace-VSC\node_modules\mysql2\lib\packets\packet.js:712:17)
at Query.execute (C:\Users\Aravind\Documents\workspace-VSC\node_modules\mysql2\lib\commands\command.js:28:26)
at Connection.handlePacket (C:\Users\Aravind\Documents\workspace-VSC\node_modules\mysql2\lib\connection.js:417:32)
at PacketParser.onPacket (C:\Users\Aravind\Documents\workspace-VSC\node_modules\mysql2\lib\connection.js:75:12)
at PacketParser.executeStart (C:\Users\Aravind\Documents\workspace-VSC\node_modules\mysql2\lib\packet_parser.js:75:16)
at Socket.<anonymous> (C:\Users\Aravind\Documents\workspace-VSC\node_modules\mysql2\lib\connection.js:82:25)
at Socket.emit (events.js:210:5)
at addChunk (_stream_readable.js:309:12)
at readableAddChunk (_stream_readable.js:290:11)
at Socket.Readable.push (_stream_readable.js:224:10)
at TCP.onStreamRead (internal/stream_base_commons.js:182:23)
code: 'ER_TRUNCATED_WRONG_VALUE_FOR_FIELD',
errno: 1366,
sqlState: 'HY000',
sqlMessage: "Incorrect integer value: '[object SequelizeInstance:product]' for column 'productId' at row 1",
sql: "INSERT INTO `cartItems` (`id`,`quantity`,`createdAt`,`updatedAt`,`cartId`,`productId`) VALUES (NULL,1,'2020-02-22 07:39:45','2020-02-22 07:39:45',1,'[object SequelizeInstance:product]');",
parameters: undefined
,
original: Error: Incorrect integer value: '[object SequelizeInstance:product]' for column 'productId' at row 1
at Packet.asError (C:\Users\Aravind\Documents\workspace-VSC\node_modules\mysql2\lib\packets\packet.js:712:17)
at Query.execute (C:\Users\Aravind\Documents\workspace-VSC\node_modules\mysql2\lib\commands\command.js:28:26)
at Connection.handlePacket (C:\Users\Aravind\Documents\workspace-VSC\node_modules\mysql2\lib\connection.js:417:32)
at PacketParser.onPacket (C:\Users\Aravind\Documents\workspace-VSC\node_modules\mysql2\lib\connection.js:75:12)
at PacketParser.executeStart (C:\Users\Aravind\Documents\workspace-VSC\node_modules\mysql2\lib\packet_parser.js:75:16)
at Socket.<anonymous> (C:\Users\Aravind\Documents\workspace-VSC\node_modules\mysql2\lib\connection.js:82:25)
at Socket.emit (events.js:210:5)
at addChunk (_stream_readable.js:309:12)
at readableAddChunk (_stream_readable.js:290:11)
at Socket.Readable.push (_stream_readable.js:224:10)
at TCP.onStreamRead (internal/stream_base_commons.js:182:23)
code: 'ER_TRUNCATED_WRONG_VALUE_FOR_FIELD',
errno: 1366,
sqlState: 'HY000',
sqlMessage: "Incorrect integer value: '[object SequelizeInstance:product]' for column 'productId' at row 1",
sql: "INSERT INTO `cartItems` (`id`,`quantity`,`createdAt`,`updatedAt`,`cartId`,`productId`) VALUES (NULL,1,'2020-02-22 07:39:45','2020-02-22 07:39:45',1,'[object SequelizeInstance:product]');",
parameters: undefined
,
sql: "INSERT INTO `cartItems` (`id`,`quantity`,`createdAt`,`updatedAt`,`cartId`,`productId`) VALUES (NULL,1,'2020-02-22 07:39:45','2020-02-22 07:39:45',1,'[object SequelizeInstance:product]');",
parameters: undefined
谁能告诉我我在这里做错了什么。我可以按如下方式 console.log() product 的值,我认为这是正确的。
product product
dataValues:
id: 1,
title: "Children's book",
price: 20,
imageUrl: 'orth-dakota-sunflower.jpg',
description: 'https://dynai5135742-02-n',
createdAt: 2020-02-22T10:05:22.000Z,
updatedAt: 2020-02-22T10:05:22.000Z
,
_previousDataValues:
id: 1,
title: "Children's book",
price: 20,
imageUrl: 'orth-dakota-sunflower.jpg',
description: 'https://dynai5135742-02-n',
createdAt: 2020-02-22T10:05:22.000Z,
updatedAt: 2020-02-22T10:05:22.000Z
,
_changed: ,
_modelOptions:
timestamps: true,
validate: ,
freezeTableName: false,
underscored: false,
paranoid: false,
rejectOnEmpty: false,
whereCollection: id: '1' ,
schema: null,
schemaDelimiter: '',
defaultScope: ,
scopes: ,
indexes: [],
name: plural: 'products', singular: 'product' ,
omitNull: false,
sequelize: Sequelize
options: [Object],
config: [Object],
dialect: [MysqlDialect],
queryInterface: [QueryInterface],
models: [Object],
modelManager: [ModelManager],
connectionManager: [ConnectionManager],
importCache:
,
hooks:
,
_options:
isNewRecord: false,
_schema: null,
_schemaDelimiter: '',
raw: true,
attributes: [
'id',
'title',
'price',
'imageUrl',
'description',
'createdAt',
'updatedAt'
]
,
isNewRecord: false
提前致谢。
【问题讨论】:
【参考方案1】:看起来,在退回您使用return Product.findByPk(prodId);
找到的产品后,您的下一个then
将作为product.product
接收它。所以应该是:
.then(product =>
console.log('product', product.product);
return fetchedCart.addProduct(product.product,
through: quantity: qty
);
)
编辑 1:
我的错,弄错了。我相信那么,您将需要获取纯数据:
.then(product =>
const plainProduct = product.get( plain: true );
return fetchedCart.addProduct(plainProduct,
through: quantity: qty
);
)
【讨论】:
No .."product product" 是 console.log(product,product) 的结果。此外 console.log('product', product.product);正在返回“产品未定义” id: 1, title: 'Jataka Tales', price: 45, imageUrl: 'efg', description: 'plainProduct', createdAt: 2020-02-22T13:34:59.000Z, updatedAt : 2020-02-22T13:34:59.000Z 执行 (默认): INSERT INTOcartItems
(id
,quantity
,createdAt
,updatedAt
,cartId
,productId
) ,1,'2020-02-22 13:35:01','2020-02-22 13:35:01',1,'[对象对象]'); DatabaseError [SequelizeDatabaseError]: Incorrect integer value: '[object Object]' for column 'productId' at row 1 这是我现在得到的
@aravindnarayanan 好的,我需要看看 addProduct
方法。
据我所知,addProduct 是 Sequelize ORM 自动提供的一种将记录插入表 Product 的方法...它没有明确的主体。它接受一个产品对象并将其插入到表中。
好的,我知道这个功能。我希望你不这样说。以上是关于获取 DatabaseError [SequelizeDatabaseError],不正确的整数值的主要内容,如果未能解决你的问题,请参考以下文章
cx_Oracle.DatabaseError: ORA-12514
DatabaseError: (1071, '指定的密钥太长;最大密钥长度为 767 字节')