所以我有点困在这里。
我有一个对象,比如:
var lineItems = [
{
id: 1,
quantity: 10
},
{
id: 2,
quantity: 15
},
{
id: 4,
quantity: 22
}
]
现在,我需要做的是在pg promise SQL事务中循环执行此操作,以确保数据库数量中关联id的行项>=对象项,因此:
SELECT * FROM inventory WHERE id = $1 AND quantity >= $2, [1,10],
SELECT * FROM inventory WHERE id = $1 AND quantity >= $2, [2,15],
SELECT * FROM inventory WHERE id = $1 AND quantity >= $2, [4,22]
如果我收到3个结果,那么对象是真的,我可以用
INSERT INTO orders SET a = 1, b = 2, c = 3, items = lineItems::json etc RETURNING id;
当然,如果我得到的结果比lineItems对象中的少,那么我就不需要使用
INSERT
语句,只需返回一个'item id: 4, quantity:22 doesn't have enough inventory to perform your request...
我最初使用的是:
db.tx(function(t)){
return this.batch([
checkInventory
])
.then(function(inv){
console.log( inv );
});
})
.then(function(results){
console.log( results );
})
.catch(function(error){
console.log( error );
});
其中
checkInventory
是我调用的函数var checkInventory = function(){
console.log( '|-------------------------------------|' );
console.log( 'LINE ITEMS >> ', lineItems );
var query = [], sql = '';
for( var i = 0; i < lineItems.length; i++ ){
sql += 'SELECT quantity FROM pim_inventory WHERE';
sql += ' product_id = $1 AND quantity >= $2;';
var pquery = [
lineItems[i].id,
lineItems[i].quantity
];
query.push(this.one(sql, pquery));
}
console.log( 'invQUERY >> ', query );
return query;
};
这将生成以下错误:
(node:44810) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): QueryResultError: Multiple rows were not expected.
(node:44810) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 4): error: syntax error at or near "product_id"
|-------------------------------------|
EVENTS >> [ [ Promise {
<rejected> QueryResultError: Multiple rows were not expected.
at QueryResultError.Error (native)
at new QueryResultError (/Users/directtap-dev/www/GitHub/v1.02/node_modules/pg-promise/lib/errors.js:13:22)
at Query.callback (/Users/directtap-dev/www/GitHub/v1.02/node_modules/pg-promise/lib/index.js:629:38)
at Query.handleReadyForQuery (/Users/directtap-dev/www/GitHub/v1.02/node_modules/pg/lib/query.js:89:10)
at Connection.<anonymous> (/Users/directtap-dev/www/GitHub/v1.02/node_modules/pg/lib/client.js:163:19)
at emitOne (events.js:101:20)
at Connection.emit (events.js:188:7)
at Socket.<anonymous> (/Users/directtap-dev/www/GitHub/v1.02/node_modules/pg/lib/connection.js:109:12)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7) },
Promise { <rejected> [Object] } ] ]
有什么想法吗?
最佳答案
当你一次问太多问题时,你很可能会在中间犯多个错误。试着一次解决一个问题。
在你的代码中至少有5个问题,显然。。。
问题1
当您使用这个:this.one(sql, pquery)
时,您创建的每个请求都只需要返回一行,但其中至少有一个请求返回多行,因此出现错误Multiple rows were not expected.
。看到method's API,就在那里。
问题2
您使用函数checkInventory
生成一个承诺数组,这很好,但是您不直接将其传递到方法batch
中,而是执行batch([checkInventory])
,这将导致batch([[promises]])
,而该方法不会因此而得到解析。
问题3
您使用的是checkInventory
而不是无效的函数。你应该打电话给batch(checkInventory())
。
问题4
很明显,您没有显示完整的代码,因为在某个地方,您没有链接您创建的承诺,这会导致松散的承诺,然后最终Unhadled promise rejection
。
问题5
为product_id
传递的某些值无效,因此出现服务器级错误。
关于node.js - pg-promise交易回应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41991314/